最終更新 2024.04.01
arduino チュートリアル基礎編 http://www.musashinodenpa.com/arduino/ref/index.php?f=2 arduino 日本語リファレンス http://www.musashinodenpa.com/arduino/ref/ Processing processing.html
1.0.5 hardware\arduino\boards.txt 1.8.1 \hardware\arduino\avr\boards.txt
arduino.exe をダブルクリックすると エディタが起動する。デフォルトで現在の日付が入った 空白のスケッチを開く。 各々のスケッチにつき、1 つのフォルダが割り当てられる。 以前作成したプログラムを開きたい場合は 「ファイル」→「開く」で ino ファイルをオープンする。
デバイスマネージャで Arduino に対応するシリアルポートの番号 (ex. COM3) を確認する。 番号を自分で設定したい場合は Arduino UNO のアイコンを ダブルクリックしてプロパティのウィンドウを表示し、 「詳細設定」で COM ポート番号 を指定する。 一度指定した後、USB ケーブルを抜き差ししたほうがよい。 arduino.exe エディタで以下の 2 つを設定する。 (1) ツール ---- マイコンボード でボードを指定する (2) ツール ---- シリアルポート でシリアルポート番号を指定する。
<配色> lib\theme\theme.txt lib\theme\syntax\default.xml 1.0.5 では theme.txt のみを編集すれば良かったが、 1.8.1 では default.xml もいじる必要がある。 () {} の色は default.xml で設定する。 私用の主な変更点 -------------- theme.txt ---------------- editor.bgcolor = #000000 editor.fgcolor = #ffffff editor.caret.color = #ffffff カーソル色 editor.selection.color = #808080 選択領域背景色 灰色 editor.reversed_word.style = #ff0000,plain 関数名, if, for editor.reversed_word_2.style = #00ff00,plain void, int long など editor.operator.style = #ffffff,plain = , + - < > && ++ editor.literal_string_double_quote.style = #00ff00 リテラル文字列 editor.comment1.style = #00ffff コメント文 水色 その他の箇所も以下の指針に従って変更する 黒 ----> 白 暗めの色 ----> 明るい原色 ------------------------------------------ -------------- default.xml -------------- <style token="SEPARATOR" fg="ffffff" /> その他も 000000 になっているところは ffffff に変更しておいた方が よいかもしれない。 ------------------------------------------ <バージョンの差> 1.0.5 では tone 関数が使えない。 <次回起動するまで保存しておく値> AppData\Roaming\Arduino\preferences.txt
外部エディタを使用したいときは「ファイル」---「環境設定」で チェックを入れる。以下のことが起こる。 ・プログラムの編集ができなくなる。 ・コンパイルボタンを押すと、ファイルをディスクから読み込んで コンパイルする。 使い慣れたエディタで ino ファイルを開く。 編集したら保存を押し、Arduino IDE でコンパイル・書き込みを行う。 「名前をつけて保存」をしたいときは、一時的にチェックを外す。 外部エディタ使用時、スケッチの背景色は theme.txt の中の editor.external.bgcolor が使われる。編集できない状態であることを示すため、 デフォルトは灰色になっている。明るすぎるように 思うので、#303030 くらいがよいと思う。
Arduino IDE が取り扱う言語を Arduino 言語というらしい。 processing を arduino 用に若干変更した言語のようだ。 processing については ここ を参照。 C++ 風である。 以下のように setup() と loop() の 2 つの関数を必ず持つ。 // 電源を入れたとき、リセットを押したときに一度だけ呼ばれる void setup() { pinMode(2,INPUT); pinMode(3,OUTPUT); } // この関数が繰り返し呼ばれる。 void loop(){ digitalWrite(2,HIGH); delay(500); digitalWrite(2,LOW); delay(500); }
int は 2 byte なので -32768 〜 32767 までしか入らない。 この値を超えると、計算が破綻する。 int ではなく long を使った方が良いかもしれない。 整数も 2 byte なので 500 * 1000 はダメ。 500L * 1000L とかく。
上側 左から順に Aref GND 13 12 ------ 0 デジタル 下側 左から順に Reset 3.3V 5V Gnd×2 Vin 0---5 アナログ ピン番号 0〜13 デジタル入出力 Analog in の 0--5 をデジタルとして使うときは 14〜19 番が割り当てられる。
<使用するピンの宣言> pinMode(1,INPUT); pinMode(2,OUTPUT); <入力> int a,d; d = digitalRead(1); 値は HIGH か LOW a = analogRead(3); 値は 0〜1023 <出力> digitalWrite(11,LOW); digitalWrite(12,HIGH); unsigned char value; analogWrite(5,value); 値は 0〜255 アナログ出力可能なのは D3, D5, D6, D9, D10, D11 アナログ出力する場合は pinMode の宣言は不要
C 言語とほぼ同じだが、%f は使えない。 %d int %ld long %s char %f は使えないが、その代わりに以下のようにする float f; char moji[10]; dtostrf(f, 6, 1, moji); 6 桁 小数点以下 1 桁
> パソコンと USB ケーブルで接続 シリアルで送受信すると、パソコンの COM ポートとやりとりする。 シリアルモニタ(使い方は後述)、TeraTerm などを用いる。 このとき、TX, RX 端子に回路を接続してはならない。 パソコンと接続したままでも TX は使えるが、 RX に別の回路を接続すると、パソコンからの書き込みができない。 > パソコンとは接続していないとき シリアルで送受信すると、TX, RX 端子にアクセスする。
Sereal.read() で 1 バイト読み込む。何もデータがないときは -1 を返す。 サンプルプログラム sereal_read_char(); // 1 個読み込む serial_read_line(char buf[],int n); // 1 行読み込む void setup(){ Serial.begin(9600); } int serial_read_char(){ int cha; while(1){ cha = Serial.read(); // 入力なしのとき -1 if ( cha != -1 ) break; // 何か入力があったなら、ループ脱出 } return cha; } /* シリアルポートから 1 行読み取る。 デリミタが来る前にバッファが一杯になったときは return する。 1 行読み取ったか、バッファが一杯になったかを区別するため、 int 型の関数にして、リターンコードを変えた方が良いと思う。 送り側も自分で作るので、ここではサボっている。 この例ではデリミタは 0x0a ( \n ) としているが、 私は普段はデリミタとして目に見える文字である '.' を使っている。 そのときは int('.') 改行記号は OS によって CR or CR+LF or LF などややこしい。 */ void serial_read_line(char buf[], int n){ int i = 0, input; while(1){ input = Serial.read(); if ( input == -1 ) continue; if ( input == int('\n') ) { buf[i] = '\0'; return; } buf[i] = input; i++; if ( i >= n-1 ) { buf[n-1] = '\0'; return; } } } void loop{ char str[100]; sereal_read_line(str,100); Serial.println(str); } 出力は Serial.print("a"); Serial.println(i); Serial.write(0x0a);
arduino のプログラムを開発するときは、 デバッグ用のコンソールとしてシリアル通信を使う。 シリアルモニタを使う例 void setup(){ Serial.begin(9600); } void loop(){ char line[100]; sprintf(line,"a = %d", a); Serial.println(line); } 「ツール」→「シリアルモニタ」でシリアルポートの 読み書きができる。ボーレートを誤ると文字化けがおこる。 シリアルモニタは TeraTerm などと 異なり、コンパイルすると自動的に閉じられる。 TeraTerm を使う場合、コンパイル ---> 書き込みのたびに 切断をする必要がある。
スケッチの書き込み中にエラーが発生しました というエラーは arduino が接続されている COM ポートが 認識されていないときに発生する。 「ツール」→「シリアルポート」で正しいポートを 指定する。
exec: "{runtime.tools.ctags.path}/ctags": file does not exist ボードArduino Unoに対するコンパイル時にエラーが発生しました。 原因は不明である。以下のケースで発生した。 (1) samba の共有ディレクトリの下 (2) Dropbox の下 arduino.exe が含まれる zip ファイルを再度展開すると、 エラーが解消した。 ドキュメントの下に置くと、このエラーは発生しない。
avrdude: stk500_getsync(): not in sync: resp=0x00 Arduino のリセットスイッチを押すことで、正常に戻ること がある。そうでない場合、 プログラム書き込み時に上のエラーが出た場合、原因は シリアルピンが他のデバイスとが接続されていることである。 Arduino は PC とシリアルで接続される。 シリアルピンが他のデバイスとの接続されているとき、 PC から Arduino が見えなくなり、このエラーが出る。 あるスケッチを描き込むと、arduino の動作がおかしくなり、 2 度と書き込みが出来なくなる。そして、書き込もうとすると 上記のエラーが出る。 その arduino は USB ケーブルを接続すると、13 番ピンに 接続されている内蔵 LED (L マーク) が激しく点滅する。 arduino duemilanove で発生した。再現性がある。2 台の arduino が故障した。対処法は次項で示す。
あるスケッチ (loop 関数の中で int a[] = {1,2,3...}; のように 大きなサイズの配列を動的に確保するコードを含む) を duemilanove に書き込んで動作させると、 arduino が故障した。以下のエラーが出て、 二度とスケッチを書き込めない。 avrdude: stk500_getsync(): not in sync: resp=0x00 故障した arduino は電源を入れた直後から、13 番ポート の LED が激しく点滅する。 Duemilanove の基板から ATmega328 を取り外し、 AVR ライターを用いて、ブートローダーを書き込む。 ブートローダーのバイナリ \arduino-1.0.5-r2\hardware\arduino\bootloaders\atmega\ATmegaBOOT_168_atmega328.hex である。UNO はファイルが異なるので注意。 ブートローダーのファイル名は hardware\arduino\boards.txt に書いてある。 PIC と異なり、AVR の書き込みは、落とし穴がある。 Atmega328 は内部発振モードと外部発振モードがある。 外部発振モードのとき、16M の水晶振動子と 22p のコンデンサ 2 個を 接続しないと、書き込めない。 従って、AVR ライターとの 6 本の結線 (5V, Gnd, MISO SCK SLV_RST MOSI) 以外に、 XTAL1 --- 16M 水晶 ---XTAL2 | | 22p 22p | | Gnd Gnd という接続が必要である。 このように接続して、ブートローダーを書き込んだら、 Duemilanove は復活した。 ATmega328 は新規購入時、内部発振モードに設定されている らしい。新規購入した ATmega328 にブートローダを書き込んで、 Arduino Duemilanove の基板に差しても動作しなかった。 内部発振器か外部発振器かの選択は、ヒューズの設定で 行う。ヒューズの設定は hex ファイルの書き込み とは別である。ゆえに、新規購入の ATmega328 を使うときは、 「ブートローダーの書き込み」「ヒューズの設定」の 2 つ が必要である。ヒューズの設定は hardware\arduino\boards.txt に書いてある。
delay(1000); 単位は ms delayMicroseconds(10); 単位は us
analogWrite(pin, value) pin: 3, 5, 6, 9, 10, 11 ピンの横に 〜 の印がある value: 0--255 周波数は 490 Hz
矩形波を tone で出すことができる。 arduino-1.0.5 では使えない。 arduino-1.8.1 では使える。 tone(pin, freq, time) freq [Hz] time [ms] time を省略した場合 noTone() を実行するまで続ける。 (注意!) tone はコールして即座にリターンする。 この関数は 3 と 11 の PWM 出力を妨げる。
long 整数 sprintf で %d は int 用 %ld を使わないと正しく出力されない。 実数 sprintf で %f %lf は使えない。 float f; char str[100]; dtostrv(f, 6, 1, str); // 6 桁出力 小数点以下 1 桁
1602A はという 16x2 の LCD あある。I2C アダプタ付きのが便利。 たとえば、amazon で売っている。 https://www.amazon.co.jp/WayinTop-%E3%83%87%E3%82%A3%E3%82%B9%E3%83%97%E3%83%AC%E3%82%A4%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB-16%C3%972%E3%82%AD%E3%83%A3%E3%83%A9%E3%82%AF%E3%82%BF-%E3%83%90%E3%83%83%E3%82%AF%E3%83%A9%E3%82%A4%E3%83%88%E4%BB%98%E3%81%8D-%E3%82%B7%E3%83%AA%E3%82%A2%E3%83%AB%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%95%E3%82%A7%E3%82%A4%E3%82%B9/dp/B07WTMXRTQ/ref=sr_1_3?dchild=1&hvadid=386688092362&hvdev=c&jp-ad-ap=0&keywords=i2c+1602+lcd&qid=1604920246&sr=8-3&tag=yahhyd-22 使い方はこのサイトに書いてある https://iot.keicode.com/arduino/arduino-lcd-i2c.php LiquidCrystal_I2C のライブラリをインストールする 必要がある。zip ファイルをダウロードし、展開する。 ドキュメントの下の Arduino の下に library というフォルダが あるので、その下にコピーする。zip ファイルを展開すると、 .../abc/abc/... という感じの階層が得られる。同じ名前のフォルダが 2 層ある。 コピーするときは、下の階層のフォルダをコピーする。 買った直後は、コントラストが調整されていないので、 何も見えない。コントラストの調整をする必要がある。
DS18B20 という温度センサがある。水温も測れる。 amazon に売っている。 https://www.amazon.co.jp/3%E5%80%8B-%E3%82%BB%E3%83%83%E3%83%88-Arduino%E3%82%BB%E3%83%B3%E3%82%B5%E3%83%BCDS18B20%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E9%98%B2%E6%B0%B4%E3%83%87%E3%82%B8%E3%82%BF%E3%83%AB%E3%82%B5%E3%83%BC%E3%83%9E%E3%83%AB%E3%83%97%E3%83%AD%E3%83%BC%E3%83%96%E3%81%BE%E3%81%9F%E3%81%AF%E3%82%BB%E3%83%B3%E3%82%B5%E3%83%BC%E3%83%A9%E3%83%9C%E6%B8%A9%E5%BA%A6%E6%B8%AC%E5%AE%9A%E6%9D%90%E6%96%99-1M/dp/B07M886SBK/ref=sr_1_8?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=%E6%B0%B4%E6%B8%A9%E3%82%BB%E3%83%B3%E3%82%B5%E3%83%BC&qid=1604920923&sr=8-8 使い方はここに書いてある 3 2 つのライブラリをインストールする必要がある。 それぞれ OneWire Arduino DallasTemperature Arduino で検索すると、zip ファイルが https://www.arduinolibraries.info/libraries/one-wire https://www.arduinolibraries.info/libraries/dallas-temperature に見つかる。zip ファイルをダウンロードし、 展開し C:\Users\user-name\Documents\Arduino\libraries 以下にコピーする。zip ファイルを展開すると .../lib-name/lib-name/... というフォルダ構造になる。2 層目のフォルダをコピーする。 1 層目ではダメ。認識しない。ライブラリの場所は C:\Users\user-name\Documens\Arduino-1.8.10\libraries 以下でも良いと思われる。