最終更新 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 以下でも良いと思われる。