arduino の覚え書き

最終更新  2018.11.05


◆◆ 参考 url ◆◆

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 でコンパイル・書き込みを行う。

「名前をつけて保存」をしたいときは、一時的にチェックを外す。


◆◆ プログラムのパターン ◆◆

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〜255

<出力>

digitalWrite(11,LOW);
digitalWrite(12,HIGH);

unsigned char value;
analogWrite(5,value);

アナログ出力可能なのは D3, D5, D6, D9, D10, D11
アナログ出力する場合は pinMode の宣言は不要

◆◆ シリアル通信(ハードウェア) ◆◆

> パソコンと 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 を使う場合、コンパイル ---> 書き込みのたびに
切断をする必要がある。


◆◆ エラー ◆◆

avrdude: stk500_getsync(): not in sync: resp=0x00

プログラム書き込み時に上のエラーが出た場合、原因は
シリアルピンが他のデバイスとが接続されていることである。

Arduino は PC とシリアルで接続される。
シリアルピンが他のデバイスとの接続されているとき、
PC から Arduino が見えなくなり、このエラーが出る。


あるスケッチを描き込むと、arduino の動作がおかしくなり、
2 度と書き込みが出来なくなる。そして、書き込もうとすると
上記のエラーが出る。

その arduino は USB ケーブルを接続すると、13 番ピンに
接続されている内蔵 LED (L マーク) が激しく点滅する。

arduino duemilanove で発生した。再現性がある。2 台の
arduino が故障した。対処法は次項で示す。


◆◆ duemilanove の故障 ◆◆

あるスケッチ (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

◆◆ PWM ◆◆

analogWrite(pin, value)

pin: 3, 5, 6, 9, 10, 11
     ピンの横に 〜 の印がある
value: 0--255

周波数は 490 Hz

◆◆ 音を出す(矩形波 tone 使用) ◆◆

矩形波を tone で出すことができる。

arduino-1.0.5 では使えない。
arduino-1.8.1 では使える。

tone(pin, freq, time)

freq [Hz]
time [ms]

time を省略した場合 noTone() を実行するまで続ける。

(注意!)
tone はコールして即座にリターンする。
この関数は 3 と 11 の PWM 出力を妨げる。