Shujima Blog

Apple製品,技術系の話をするブログ

応用情報技術者を短期間で取得する方法

あくまで,個人的意見ですが... ITパスポートや基本情報を受けたことがない状態で,3週間勉強して応用情報技術者に合格しました. モチベーションや取り組んでいる分野など,自分と異なる環境の方が多いと思いますが,短期間で合格したい方にオススメの情報を書きました.

実際にやってみた勉強法

0. 勉強を始めたときの状況

資格オタクで,電気系の資格などを受けていた. 意識が高いときに「応用情報持っていたらカッコよくね??」と申し込む. 一応,趣味でC言語のプログラミングをしていたので,勉強すればなんとかなるのではないかという勝算を持っていた. 結局,試験3週間前(10月はじめ)まで勉強せず,焦って勉強しだした.

1. 過去問を見て絶望する

過去問を開いてみます.どうせしょっぱなから解けるわけありませんが,敵を知るのは重要なことです.

平成30年度【秋期】 応用情報技術者 パーフェクトラーニング過去問題集 (情報処理技術者試験)

平成30年度【秋期】 応用情報技術者 パーフェクトラーニング過去問題集 (情報処理技術者試験)

2. 参考書の中で,できそうな範囲7割に絞る

参考書をなにかしら1冊用意しましょう.好みによると思いますので,本屋で見て買うのがオススメです.比較的簡単だな,身近だなと感じた範囲7割に絞ります.残りのページは本に×などと書き込んでもいいですし,やらなくていいことを体感できるようにしましょう.私はマスキングテープで封をしました. 封をした意味ですが,「この範囲だけ確実にやれば受かる」ことを理解するためです.7割を80%正解したとして,残りの範囲を適当に丸すれば,65点くらいは狙えます.まずは範囲を絞って学習しましょう. サーバー内の話(データベースとか)は封しがいがありました.

応用情報技術者 徹底合格テキスト 2018年版 (徹底合格シリーズ)

応用情報技術者 徹底合格テキスト 2018年版 (徹底合格シリーズ)

3. 解けそうな過去問から順に解く

 何年度を1問目から,などではなく,適当にめくってできそうな問題からやりましょう.やった問題には,小さく○を書くなど,達成度を把握できるようにしましょう.  問題の隣に解答があれば,遠慮なく見ながら考えましょう.ただし見るだけではなく,過去問自体やノートなどに書き込みながら考えましょう.  1年分の問題には手をつけないなど,問題を出し惜しみするのは,無駄なのでやめましょう.  勉強に使う本は,過去問が圧倒的に大事です.解説の質よりも,問題と解答を行き来しやすく,見やすいものを選びましょう. 過去問は本屋だとあまり売っていないのでネット通販でいいと思います.

平成30年度【秋期】 応用情報技術者 パーフェクトラーニング過去問題集 (情報処理技術者試験)

平成30年度【秋期】 応用情報技術者 パーフェクトラーニング過去問題集 (情報処理技術者試験)

4. 飽きたら別の本を読んでみる

過去問に飽きたら,資格から少し離れた参考書を読んでみましょう.ネットワークは,IPパケットの気持ちになってどのように目的地までたどり着けるのかを考えていくと,理解が捗ります.少し遠回りですが,難問がすんなりと理解できたりするかもしれません.

苦手な分野があれば,以下の本などがオススメです.

ネットワーク超入門講座 第4版

ネットワーク超入門講座 第4版

おうちで学べるデータベースのきほん

おうちで学べるデータベースのきほん

ネットワークはなぜつながるのか 第2版 知っておきたいTCP/IP、LAN、光ファイバの基礎知識

ネットワークはなぜつながるのか 第2版 知っておきたいTCP/IP、LAN、光ファイバの基礎知識

5. 直前に封をした部分に手をつける

 封をした部分は徐々に解いていってもいいですが,直前には全部開きましょう.そして,丸暗記です.問題と答えを交互に見て,とにかく暗記してください.

4択を2択に絞れるだけで10点くらいあがるので.

6. 試験会場に行く

とにかく受験しましょう.勉強が足りてないかどうかを判断する意味でも,諦めずに会場にいきましょう.たった6割正解すればいいという気持ちで,気楽に挑んでください.

終わりに

私の場合はこんな感じで,試験の3週間前から勉強を始めて,合格しました. みなさんに適用可能かはわかりませんが,移り気な性格の割にモチベーションを維持できたので良い勉強法だったと思います.

【合格体験談】電験3種に合格するための,飽きなくて,効率がいい勉強法

実際にやってみた勉強法

1. 科目を選ぶ

 最初は全科目の基礎となる理論がおすすめです.得意そうな科目があれば,それから始めれば問題ありません.

2. 過去問を見て絶望する

選んだ科目の過去問を開いてみます.どうせしょっぱなから解けるわけありませんが,敵を知るのは重要なことです.

電験3種過去問題集 平成30年版

電験3種過去問題集 平成30年版

3. 参考書の中で,できそうな範囲半分に絞る

各科目,何かしらの参考書は買うべきでしょう.私はオーム社のものを使っていましたが,好みで選ぶべきです.

完全マスター電験三種受験テキスト 理論(改訂2版)

完全マスター電験三種受験テキスト 理論(改訂2版)

完全マスター電験三種受験テキスト 法規(改訂3版)

完全マスター電験三種受験テキスト 法規(改訂3版)

完全マスター電験三種受験テキスト 電力(改訂2版) (LICENCE BOOKS)

完全マスター電験三種受験テキスト 電力(改訂2版) (LICENCE BOOKS)

完全マスター電験三種受験テキスト 機械 (改訂2版)

完全マスター電験三種受験テキスト 機械 (改訂2版)

比較的簡単だな,身近だなと感じた範囲半分に絞ります.残りのページは本に×などと書き込んでもいいですし,やらなくていいことを体感できるようにしましょう.私は マスキングテープで封をしました

半分封をした意味ですが,「この範囲だけ確実にやれば受かる」ことを理解するためです.50%を得点し,さらに残りの範囲を適当に丸すれば,65点くらいは狙えます.まずは範囲を絞って学習しましょう.

4. 解けそうな過去問から順に解く

 何年度を1問目から,などではなく,適当にめくってできそうな問題からやりましょう.やった問題には,小さく○を書くなど,達成度を把握できるようにしましょう.  問題の隣に解答があれば,遠慮なく見ながら考えましょう.ただし見るだけではなく,過去問自体やノートなどに書き込みながら考えましょう.  1年分の問題には手をつけないなど,問題を出し惜しみするのは,無駄なのでやめましょう.

 過去問題集は,電気書院が見やすくて圧倒的におすすめです.答えが隣にあるのでカンニングしながら解けます.効率が段違いです.

電験3種過去問題集 平成30年版

電験3種過去問題集 平成30年版

5. 飽きたら別の本を読んでみる

過去問に飽きたら,たくさん買った参考書を読んでみましょう.電力や機械は写真付きの本を見ながらだと,実際の場面を思い浮かべながら,知識を蓄えられます.例えば以下のような.

モータの種類ごとの特性を,原理や構造をわかりやすく図解で示しながら,理解できました.

最新版 モータ技術のすべてがわかる本 (史上最強カラー図解)

最新版 モータ技術のすべてがわかる本 (史上最強カラー図解)

たくさんの電力機器や送電技術を図解で一気に記憶できました.普通に面白い本です.

史上最強カラー図解 プロが教える電気のすべてがわかる本

史上最強カラー図解 プロが教える電気のすべてがわかる本

6. 飽きたら別の科目で1〜5をやる

 受かるには4科目必要なので,まず理論を完璧になどと考えず,飽きたらどんどん別の科目も鍛えましょう.躊躇している暇はありません.

7. ある程度全科目触れてきたら封をした部分に手をつける

 封を開けるのは最終段階です.残りの範囲は点数を上げて安心するためのオプションにすぎないことを理解しながら,目を通していきましょう.  多分,他の科目の勉強などを通して,以前より理解しやすくなっていると思いますので,簡単な部分と,依然として難しい部分でわけて考えましょう.

8. 試験会場に行く

とにかく受験しましょう.勉強が足りてないかどうかを判断する意味でも,諦めずに会場にいきましょう.

その他

電卓は適度な大きさで好きなものを選びましょう.太陽電池だけではレスポンスが悪くストレスが溜まります.電池入りを選びましょう.

カシオ スタンダード電卓 時間・税計算 デスクタイプ 12桁 DF-120GT-N

カシオ スタンダード電卓 時間・税計算 デスクタイプ 12桁 DF-120GT-N

結果

1年目は春から勉強を始め,秋の試験では「理論」「電力」「機械」に合格しました.法規は1問たりませんでした...

翌年は応用情報技術者試験と電験2種にも申し込みながら勉強し,「法規」も合格しました.

説得力には欠けますが,法規で油断しなければ1年で取得できていたのでは無いでしょうか. 私の経験から言って,2年目はめちゃめちゃモチベーションが下がります.

モチベーション維持のための有効な手立てを講じない限りは2科目ずつ2年かけて取るという考えはおすすめしません.

私の場合は,法規だけの勉強だと他を忘れてしまうので,電験2種の1次試験を受けました(そっちの結果は,モチベーションが低かったこともあり,ボロボロでした).

電験3種と応用情報はどっちが難しいのか比較

ネットで両者を比較して云々言ってる人がいたので書いてみました.

全く分野が異なるものを比較しても仕方ない気がしますが,どちらも興味ある人にとっては重要なのかもしれないですね.

私の答え: 電験3種

私は電験3種と応用情報を両方持っています. その経験から言って,まず間違いなく電験の方が難しいです.

理由

試験範囲

電験は理論・電力・機械・法規の4科目に分かれています.それぞれ全く異なる内容なのですが,別の科目の範囲も知らないと解けない問題も出題されます.科目合格制度があるとはいえ,1科目ずつ取っていては全部取り終わる前に失効してしまうため,事実上は全て勉強しなければなりません.それぞれの科目で60点取れなければ不合格です.

対して応用情報の試験は午前午後の2つです.不得意な範囲があっても得意な範囲で挽回できます.私は参考書をパラパラと読んだときに,苦手だなと思った範囲は最初から勉強しませんでした.8割の範囲を8割正解できれば合格するからです.参考書の該当ページに封をして残りの勉強に専念しました.

内容

電験は電子の世界から,原発のような大電力の世界まで,様々な内容が出題されます.電子工作をする人でも,馴染みがあるのは「機械」の一部くらいなもので,ほとんど一から勉強しなければなりません.

対して応用情報はどんな言語,内容でも,プログラミングをやっていれば,何を言っているのかは理解できる問題が多いです.最初は難しくても,過去問で正確な解答を勉強すれば,一気に点数が上がります.

全くの初心者であれば両方とも難しいですが,ちょっと触れている人にとっては両者の難易度は大きく異なります.プログラミングをやったことがある人は多くても,原発を作ったことがある人はほとんどいないってことです.

電験3種を取れれば応用情報も取れるか?

人によると思います.どちらの資格も,たくさん勉強が必要なことには変わりがありません.合格に対するモチベーションと興味次第です. 電験に合格した人で,プログラミングにも興味があれば,合格率は決して低く無いと思います.

応用情報を持ってる人は電験3種も取れるか?

これも人によると思います.ただ,電験はモチベーションが持続しにくい資格かと思いますので,応用情報合格の経験がモチベーションを下支えしてくれるのでは無いでしょうか.内容自体は全く異なるので1から勉強が必要です.

経験談

電験3種

1年半かけて取得しました. 春先から勉強を始め,1年で4教科取るつもりで,必死に勉強しました.教科書を読むのはほどほどに,過去問をたくさんやりました.「過去の過去問」を中古で買い,計20年分くらいを複数回解きました.

万全の体制で挑んだ1年目の試験でしたが,理論電力機械のみ合格し,法規は惜しくも1問足りませんでした. 残りの1年は法規の勉強を万全に整えつつ,他の科目を忘れてしまわないように,電験2種の1次試験を勉強しました.

詳細は以下です.

masa-flyu.hatenablog.com

応用情報

3週間かけて取得しました. 申し込みからしばらく経っても勉強のやる気が起きず,試験の3週間前から勉強しだしました. 詳細は以下です. masa-flyu.hatenablog.com

期間だけ見れば5倍異なります.仮に電験を1年目で合格していたとしても2倍異なります.応用情報は根性論で短期間で合格できた節がありますが,電験では無理だったと思います.

Arduino DueのPWMデューティをより細かく変える(analogWriteResolution)

環境

Arduino DueのUnoに比べてはるかに柔軟に決められます.

その一つがanalogWriteResolution()関数です.

プログラム

void setup() {
pinMode(11,OUTPUT);
analogWriteResolution(12);
}

void loop() {
analogWrite(11,2047);
}

analogWriteResolution()関数のおかげで,PWMのデューティを12ビットで決めることができるようになります.12ビットの符号なし整数がとる値は0〜4095ですので,上記では2047を指定することでデューティを50%に設定しています.

その他

また,上記に加えて,PWMの周波数も変更できます(こちらはプログラム中ではなく,IDEの設定を変更する必要がありますが...).

masa-flyu.hatenablog.com

 

Arduino Due で高分解能なエンコーダを読み取ってみた

f:id:masa_flyu:20180729020326j:plain

概要

1周512[PPR](2048[counts/rev])のエンコーダを読み取って,シリアル通信で出力してみました.結論から言えば,150000[counts/s]くらいまでなら読み取れそうです.ただし,他になんの処理も挟んでいない上,1個だけの場合ですので,実際に使う場合には,10分の1くらいに抑えるのが無難じゃないでしょうか.

単位はこちらに準拠:エンコーダのPPR、CPR、LPRとは何ですか? | CUI Inc

環境

※カタログには512カウントとありますが1回転あたりのパルス数(PPR)が512です.なので,これ以降では512[PPR]=2048[Cycles/rev]として話を進めます.

高いですが,ごく普通の高分解能エンコーダです.A相B相の+側をArduinoのdigitalに,-側をGNDにつないで,電源として5Vを加えています.

Arduino DueのIOは3.3V入力ですが,エンコーダの5V出力を直接つなぎました.推奨しません.

プログラム

以下のプログラムは以下のURLにあるタイマ割り込みプログラムを使用しています.

DUEでのタイマー割り込みメモ

//このプログラムは Arduino DUE 用です

//エンコーダピン番号
#define ENC_A 2
#define ENC_B 3

void itr_A(); //割り込み関数
void itr_B(); //割り込み関数
void TC3_Handler();
void startTimer(Tc *tc, uint32_t channel, IRQn_Type irq, uint32_t mSec);

long count=0;
long recentcount = 0;

void setup() {
  //エンコーダの2つのピンを入力に
  pinMode(ENC_A, INPUT);
  pinMode(ENC_B, INPUT);

  //シリアル通信(USB)の設定
  Serial.begin(115200);
  
  //入力ピンが変化した時に割り込みを入れる
  attachInterrupt(ENC_A, itr_A, CHANGE);  //Aピンが変化した時itr_A()を呼び出す
  attachInterrupt(ENC_B, itr_B, CHANGE);  //Bピンが変化した時itr_B()を呼び出す

  //タイマー(シリアル通信用)
  //http://jtakao.web.fc2.com/elec/due_timerinterrupt/index.html
  NVIC_SetPriority((IRQn_Type)TC3_IRQn,1);  //TC3タイマーの優先順位を1に設定(普通は0なので優先度を下げたことになる)。エンコーダ読み取りを優先させるため。
  startTimer(TC1, 0, TC3_IRQn, 100);  //TC3タイマーを100msecに設定

}


void loop() {
  //ループでは何もしない(割り込みが呼ばれるだけ)
}


/**********割り込み***************/

//Aピン割り込み関数
void itr_A(){
  count += digitalRead(ENC_A) == digitalRead(ENC_B) ? -1 : 1;
}

//Bピン割り込み関数
void itr_B(){
  count += digitalRead(ENC_A) == digitalRead(ENC_B) ? 1 : -1;  
}

//タイマー割り込み関数 100msecごとに呼び出される
void TC3_Handler() {
  TC_GetStatus(TC1, 0);  //時間のカウントを0に戻す
  Serial.print(count);  //エンコーダのカウントをシリアル送信  
  Serial.print("[counts]\t\t");  
  Serial.print( (count - recentcount) * 10);
  Serial.println("[counts/s]");
  recentcount = count;
}


/**********タイマー用関数***************/

//http://jtakao.web.fc2.com/elec/due_timerinterrupt/index.htmlからのコピペ
//タイマーを使いやすくしてくれているらしい
void startTimer(Tc *tc, uint32_t channel, IRQn_Type irq, uint32_t mSec) {
  pmc_enable_periph_clk((uint32_t)irq);
  TC_Configure(tc, channel, TC_CMR_WAVE | TC_CMR_WAVSEL_UP_RC | TC_CMR_TCCLKS_TIMER_CLOCK1);
  uint32_t rc = (VARIANT_MCK/2/1000)*mSec;
  TC_SetRC(tc, channel, rc);
  TC_Start(tc, channel);
  tc->TC_CHANNEL[channel].TC_IER=TC_IER_CPCS;
  tc->TC_CHANNEL[channel].TC_IDR=~TC_IER_CPCS;
  NVIC_EnableIRQ(irq);
}

プログラム解説

タイマー

DUEでのタイマー割り込みメモ startTimer()関数はこちらのサイトをコピペして,タイマー割り込みを用いています.

setup()内でstartTimer(TC1, 0, TC3_IRQn, 100);のように呼び出すことで,TC1ブロックの0番=TC3ユニットのタイマを用いて100msをカウントしています.カウント毎にシリアルを送っていてはエンコーダIOピン割り込みの時間が長くなってしまい,次の割り込みに間に合わなくなるので,100msに1回だけタイマーでシリアルを送るようにしました. この割り込みが反応するとTC3_Handler()関数が呼び出されます.

また,NVIC_SetPriority((IRQn_Type)TC3_IRQn,1);の1行を加えることで,タイマー割り込みの優先順位をエンコーダより下げているので,エンコーダIOピン割り込みには影響しないはずです.

エンコーダIOピン割り込み

attachInterrupt()関数を用いて,IOピン割り込みを入れています.その際,A相ピンとB相ピンで割り込み先の関数を変えています. A相が0または1から1または0に変化するとitr_A()が,B相が変化するとitr_B()が実行されます.

方向の判断・加減算

ここが一番難解でしょう.

エンコーダのA相,B相の波形のずれを利用して回転方向を判断します.

正回転の場合にカウントを増加,負回転の場合にカウントを減少させます.

A相を例にとって説明します.

  count += digitalRead(ENC_A) == digitalRead(ENC_B) ? -1 : 1;

A相,B相の波形を示します. f:id:masa_flyu:20180729013801p:plain 縦軸はそれぞれの相の出力(0または5V),横軸は回転角度です. 正回転であれば横軸の右へ進み,負回転であれば横軸の左へ進むものとします.

18行目でA相の割り込みを以下のように設定しています.

  attachInterrupt(ENC_A, itr_A, CHANGE);  //Aピンが変化した時itr_A()を呼び出す

第3引数をCHANGEに設定することで,A相の入力になんらか変化が生じたときに割り込みが生じるように設定しています.

つまり,A相の割り込みが発生するのはA相に変化が生じる赤い線の場所になります. f:id:masa_flyu:20180729013833p:plain

割り込みが生じたすぐあとは,正回転であれば赤線の右側,負回転であれば赤線の左側にいるはずです.回転方向を判別してカウントを+1または-1するためには,左右のどちらにいるかをA相B相の値から判断しなければなりません. 赤線の左右でのA相B相の値を書き込みました. f:id:masa_flyu:20180729013952p:plain このとき,A相とB相の値が一致しているものを青,不一致のものを黄色で表しました.すると見事に,赤線の左は青,右は黄色に塗り分けられました. つまり, A=Bのとき-1,A≠Bのとき1のように判別してカウントすることができるわけです. f:id:masa_flyu:20180729014203p:plain それをC言語で表したものが

count += digitalRead(ENC_A) == digitalRead(ENC_B) ? -1 : 1;

です,三項演算子を使って,A==Bのとき-1を,A!=Bのとき1をcountに加算しています.

なお,B相のときは青と黄色の関係が真逆になるので,1と-1を反転しています.f:id:masa_flyu:20180827150756p:plain

測定結果

上記のプログラムを走らせた状態で,Arduinoのシリアルモニタを見ながらエンコーダを動かしてみました.下図は高速に往復させた時の値の変化です.

f:id:masa_flyu:20180729015203p:plain

最大で150000[counts/s]くらいの値が確認できますね.

一定回転を高速に往復させ続けたところ,150000[counts/s]程度であれば理論上のカウント数とおよそ一致しました. より高速に回転させたところ,最大で200000[counts/s]くらいを計測しましたが,その際には,累積のカウント数が理論上の値と大幅にずれてしまいました. 正直,計測方法がとても雑なので,自信を持っては言えないのですが,150000[counts/s]までなら測定できそうです. わりと実用的じゃないでしょうか?少なくともArduinoUnoよりはるかに実用的です.

今後の展望

以上のプログラムは,Arduino標準の関数を用いて実装しました.しかしながら,マイコンのレジスタを直接操作するなどすれば,より早い実装が可能かもしれません.

当ブログをご利用いただく際には免責事項をお読みください。