arduino プログラミング課題集 ( Ver.5.0 2017/06/01 ) arduino と各種ボードを組み合わせ 制御するためのプログラミングを学 ぼう! 1 入出力ポートの設定と利用方法 (1) 制御( コントロール ) する とは 外部装置( ペリフェラル ) が必要とする信号をマイコンから伝える 外部装置の状態をマイコンで確認する 信号の授受は 入出力ポート 経由で行う (2) 入出力ポートとは? マイコンが外部装置とデータのやり取りをするための くち プログラムでやり取りする マイコンからデータ( 信号 ) を外部装置へ送り出すことを 出力 と呼ぶ 信号は基本的に デジタル ON/OFF だけを伝えることができる (3) 出力ポート マイコンから外部装置へ信号を送る 出力ポートにデータをセットすると コンピュータの外部に
それを送り出してくれる 出力したデータはポート自体に保持される ( 他のデータを送り出さなければ変化しない ) マイコン 出力ポート 外部装置 マイコン 入力ポート 外部装置
(4) 入力ポート 外部装置からマイコンに信号を取り込む マイコンが周辺装置から受け取ったデータを入力ポートが記憶する そこから変数等に読み込んで処理を行う 2 arduino のプログラミング (1) 開発環境 IDE マイコン 周辺装置を接続した状態にして USB 経由で PC に接続しておく プロジェクトを スケッチ と呼ぶ C 言語で記述する スケッチを作成したらコンパイルして arduino に書き込み 実行させる (2)arduino のプログラミング基本形 void setup() { 初期設定等を行う } void loop() { メインとなる処理 ( 無限ループ ) } (3) 入出力の初期化 ( イニシャライズ )
arduino のポートは入力 出力のどちらにでも設定できる すべての処理に先立って 入力 出力のどちらかに設定をする 通常 setup() の中に書いておく pinmode( ピン番号, OUTPUT または INPUT); ピン番号 pin2-13 自由に使えるデジタル入出力ピン入力は digitalread( ピン番号 ) 出力は digitalwrite( ピン番号, HIGH / LOW) A0 -A5 アナログ入力ピン pin 14-20 としてデジタルでも使える pin0, 1 は PC との通信用 基本構成次のように周辺装置と接続する 出力 pin9(msb) - pin2(lsb) 入力 pin17(msb) - pin10(lsb) ポート初期化プログラム void setup() { int i; // ポートの初期設定 for (i = 2; i <= 9; i++) pinmode(i, OUTPUT);
for (i = 10; i <= 17; i++) pinmode(i, INPUT); } (4) 出力 特定のピンに HIGH または LOW を出力 digitalwrite( ピン番号, HIGH / LOW); (5) 入力 特定のピンから信号を読み込む digitalread( ピン番号 ); 読み込んだデータを変数に記憶させるためには 変数名 = digitalread( ピン番号 ); (6) 変数の大きさ ( ビット数 ) int 型 16bit (unsigned も同様 ) long 型 32bit (unsigned も同様 ) char 型 8bit (unsigned も同様 ) (7)delay() 関数 時間待ちする ( だけの関数 ) 引数はミリ秒単位の数値
delay(1000); で約 1 秒待つ実行中は何も操作を受け付けないので注意 より短いタイマーには delaymicroseconds() を使う ( ) 内は unsigned int (16bit) 単位は [μs] 3~16,000 ぐらいで正確に動作する (8)PC との通信 ( シリアル通信 ) USB を経由して arduino と PC との間で通信ができる Serial.begin( データ転送レート ); Serial.print( 表示データ [, フォーマット ]); Serial.read(); データ転送レート (bps) 300, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600, 115200 PC 側は IDE で シリアルモニタ を起動してデータを送受信する ツール シリアルモニタ ショートカットは Ctrl + Shift + M arduino 側の受信は 何も入力がないとき -1 になる 2 arduino のプログラミング LED 制御 arduino 用マザーボードに LED ボードを接続して 点灯 消灯を制御す るプログラムを作成 動作させよう
( プログラム 1) LED を全部点灯させなさい (LED は負論理なので 8 ビットすべて 0 を出力すると点灯 ) ( プログラム 2) LED を全部消灯させなさい ( プログラム 3) LED の上位 4 ビットを点灯 下位 4 ビットを消灯させなさい ( プログラム 4) LED を交互に点灯 / 消灯させなさい ( プログラム5) LED 全部点灯 / 全部消灯を交互に繰り返しなさい (0.3 秒間隔で ) ポイント : 時間を稼ぐ=ディレイを使う ( プログラム6) LED 下位 4 ビットを使って 16 進カウンタを構成しなさい
( プログラム7) LED 下位 4 ビットを使って 10 進カウンタを構成しなさい ( プログラム8) 8 進リングカウンタを構成しなさい ( シフト演算を使う ) ( プログラム8) 8 進リングカウンタ 逆方向を構成しなさい ( シフト演算を使う ) ( プログラム9) 上下 4ビットずつ 4 進のリングカウンタを構成しなさい ( 最初へ戻る ) ( プログラム10) LED を高速に ON/OFF させ 輝度をコントロールしよう デューティー比 (ON/OFF の割合 ) や周期を変えてテストしよう 最終的には LED8 個とも輝度が変わって それが時間とともに変化しながら点灯することを目指す
3 LED とプッシュスイッチの制御 arduino 用マザーボードに LED ボードとプッシュスイッチボードを接続 して制御プログラムを作ろう ( プログラム 1) スイッチの入力値をそのまま LED へ出力しなさい ( スイッチ ON のビットのみ 対応する LED が点灯 ) ( プログラム 2) スイッチの入力値を論理反転して LED へ出力しなさい (OFF のビットのみ LED が点灯 ) ( プログラム 3) スイッチの LSB の ON/OFF で LED 全部を ON/OFF しなさい ( プログラム 4) スイッチの MSB の ON/OFF で LED を交互に ON/OFF しなさい (ON) (OFF) ( プログラム5) 押しているスイッチの個数を LED に表示しなさい ( 例 )0 個 3 個 7 個 8 個
( プログラム 6) スイッチの LSB の ON/OFF の回数を LED に正論理で表示しなさい 但し タイマーでチャタリングの対策を行うこと ( プログラム7) 256 進のバイナリカウンタを構成しなさい スイッチの LSB を押したらリセット (0) カウントは停止 スイッチの MSB を押したらカウント開始 停止 LSB を優先 ( プログラム8) リングカウンタを動作させなさい (LSB MSB の順にカウント ) 但しスイッチの MSB を押したときカウント開始 停止 スイッチの LSB を押したらリセット カウントは停止 LSB を優先 ( プログラム9) シフトカウンタを動作させなさい 最初に戻るスイッチの条件はプログラム8と同様とする 4 PC とのシリアル通信 入力にスチッチボード 出力に LED ボードを接続しておく データ転送速度は 9,600bps とする
( プログラム 1) LED を全部消灯し 通信の開始を知らせるメッセージを表示した後 1 秒 刻みでモニタ画面に arduino! と表示させなさい 改行すること ( プログラム2) LED を全部消灯し 通信の開始を知らせるメッセージを表示した後 1 秒刻みでモニタ画面にスイッチの状態を表示させなさい ON は 0 OFF は 1 で 00001111 ( 改行 ) のように表示させること ( プログラム3) LED を全部消灯し 通信の開始を知らせるメッセージを表示した後 PC からデータ 'a' を受信したら LED を全部点灯 'd' を受信したら LED を全部消灯 'x' を受信したら点灯 消灯状態を逆転させなさい