Aliexpressで電子工作-19 Arduinoで遊んでみる
以前はよくPICを使用していましたが、Arduinoも種類が多くAliexpressなどでは互換機がかなり安く売られているようなのでちょっと遊んでみることにしました。
一般的にはマイコンにプログラムを書き込むには何らかの書き込み装置が必要となります。例えばPICならばPICkit™3などがそれにあたります。
ところがArduinoはPCにUSBで接続するだけでArduino用のIDEからスケッチ(Arduinoで動かすプログラムをスケッチと呼ぶ)を書き込むことができます。
Arduinoの定番というか入門的な機種はunoまたはnanoあたりでしょうか?初めての場合は非常に使いやすくなるようになっているようですが、いままでPICを使ってきた自分からするともっと安く小さく無駄のないものはないかと思ってしまいます。探してみるとArduino Pro-miniというのが安くて無駄のない作りになっているようです。初めて使う人にはいろいろ準備などが必要になることがありますが以前に何らかのマイコンを使ったことがある人にはちょっと遊んでみるには非常に経済的です。
定番のArduinoはAVRのATMega328Pというのが使われていますが、今回使ってみるものは少しメモリが少ないATMega168Pが使われています。そのせいもあり大変安く1枚当たり130円くらいでした。3枚で送料込み407円で購入したものです。探せばもっと安いのもあると思います。ものにもよりますがこれくらいの商品の場合4枚くらいまでは送料が安く5枚を超えるあたりから急に高くなるものが多いので送料や枚数も考慮して購入するといいのではないでしょうか。
これは多少、量産を意識して作られているのでPCと接続するための回路が省略されています。例えばF232RL、CP2102、CH340G、PL2303などよくあるUSB-TTLコンバータが使用できます。手持ちにあれば使うことができるし新規に購入しても1枚100円程度で購入できます。一応先に上げたチップが載っているものが使えるのですが面倒なことをしたくない場合はTXD、RXDの他にDTR信号が出ているものを使ったほうがいいでしょう。(DTRがなくても少々面倒ですが使えます)これはかなり前にAmazonで200円くらいで購入したものです。使われているチップはPL2303でWindows10で使うには苦労しますがこんなものでも使うことができました。新規に購入するのは推奨できません。
購入するならFT232RLやCP2102などのチップのものをAliexpressで安く購入できますのでその方がいいと思います。Pro Miniのシリアル端子はF232RLのモジュールのピン配置に合わせて作られているので接続も容易です。同じ端子同士を接続するだけです。
CP2102もDTR端子が出ていて比較的安いのでいいのではないでしょうか。
私が購入したCH340GのモジュールはDTR端子が出ていなかったので多少使い方が面倒ですが、このチップは安いためDTR端子が出ているタイプがあったらいいかもしれません。
digitalWriteとanalogWriteの違い
ArduinoのスケッチはC言語に近いですが、電気/電子系の人やコンピュータ系以外の人にも使ってもらうことを考えてるらしくいろいろな面で簡略化してあります。中でもI/Oに関しては初心者にもわかりやすい表現になっています。
一般に言う汎用I/Oを・digitalWriteといい、A/D入力・PWM出力をanalogRead・analogWriteと呼んでいます。
こんな話ばかりではつまらないので何か動かしてみましょう。やはり定番のLチカですかね。
いわゆるナイトライダーというやつです。
これはdigitalWriteを使っていますが、analogWriteを使うとどう変わるでしょう?
LEDが消灯するときに尾を引くようにゆっくり消えていきます。ほかのマイコンでは普通にLEDを点灯・消灯するのに比べると多少複雑なプログラムを書かなければなりませんがArduinoではanalogWriteを使うことによって簡単に実現できてしまいます。回路とスケッチのソースも載せておきましょう。
CADも初心者向けというわけではないですがFritzingというのを使ってみました。動画では青いLEDを使ってみましたがこの図では赤いLEDになっています。電源は仕様上は4.5V-5V(@16MHz)となっていますが3Vくらいまで下げても動作するようです。乾電池2本で動作させるには2.5V程度まで下げても動作しないと難しいですがそこまで下げるにはクロックを下げなければなりません。このボードは16MHzですが8MHzなら電池動作もできるでしょう。回路図はこうです。
digitalWriteを使ったほうのスケッチは
int const LED_PIN[6] = {11, 10, 9, 6, 5, 3}; // analogWrite ができるピンにLEDをつなぐ int const LED_PATTERN[20] = {0, 1, 2, 3, 4, 5, 4, 3, 2, 1, 0, 1, 2, 3, 4, 5, 4, 3, 2, 1}; int i; void setup() { // put your setup code here, to run once: pinMode(LED_PIN[0],OUTPUT); pinMode(LED_PIN[1],OUTPUT); pinMode(LED_PIN[2],OUTPUT); pinMode(LED_PIN[3],OUTPUT); pinMode(LED_PIN[4],OUTPUT); pinMode(LED_PIN[5],OUTPUT); } void loop() { // put your main code here, to run repeatedly: for(i=0; i<10; i++){ // LED 0 1 2 3 4 5 4 3 2 1の10通りを繰り返す digitalWrite(LED_PIN[LED_PATTERN[i+9]],LOW); // ひとつ前のLEDを消す digitalWrite(LED_PIN[LED_PATTERN[i]],HIGH); // LEDを点ける delay(140); // 次のパターン移るまでの時間、大きくすると遅くなる } }
で、analogWriteを使ったほうのスケッチは
int const LED_PIN[6] = {11, 10, 9, 6, 5, 3}; // analogWrite ができるピンにLEDをつなぐ int const LED_BRITE[] = {255, 102, 40, 16, 6, 2}; // LED の明るさ int const LED_PATTERN[10][6] = { // LEDパターン {0, 1, 2, 3, 4, 5}, // LED_STAT 0 の時のパターン {1, 0, 1, 2, 3, 4}, // 1 {2, 1, 0, 1, 2, 3}, // 2 {3, 2, 1, 0, 1, 2}, // 3 {4, 3, 2, 1, 0, 1}, // 4 {5, 4, 3, 2, 1, 0}, // 5 {4, 5, 4, 3, 2, 1}, // 6 {3, 4, 5, 4, 3, 2}, // 7 {2, 3, 4, 5, 4, 3}, // 8 {1, 2, 3, 4, 5, 4}, // 9 }; int LED_STAT = 0; // LEDステータス 0~9 for LED_PATTERN // LED 0 1 2 3 4 5 4 3 2 1の10通りを繰り返す→0~9に対応 int i; void setup() { // put your setup code here, to run once: } void loop() { // put your main code here, to run repeatedly: for(i=5; i>-1; i--){ analogWrite(LED_PIN[LED_PATTERN[LED_STAT][i]],LED_BRITE[i]); } delay(140); // LED_STATが次に移るまでの時間、大きくすると遅くなる LED_STAT++; if(LED_STAT>9)LED_STAT=0; }
こうなります。