arduino の覚え書き

最終更新  2024.04.01


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

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

外部エディタ使用時、スケッチの背景色は

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 の宣言は不要

◆◆ sprintf ◆◆


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 ポートが
認識されていないときに発生する。

「ツール」→「シリアルポート」で正しいポートを
指定する。

◆◆ ctags": file does not exist エラー ◆◆


exec: "{runtime.tools.ctags.path}/ctags": file does not exist
ボードArduino Unoに対するコンパイル時にエラーが発生しました。

原因は不明である。以下のケースで発生した。

(1) samba の共有ディレクトリの下
(2) Dropbox の下

arduino.exe が含まれる zip ファイルを再度展開すると、
エラーが解消した。


ドキュメントの下に置くと、このエラーは発生しない。

◆◆ avrdude エラー ◆◆


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

Arduino のリセットスイッチを押すことで、正常に戻ること
がある。そうでない場合、

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

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 出力を妨げる。

◆◆ long 整数、実数の出力 ◆◆


long 整数

sprintf で %d は int 用    %ld を使わないと正しく出力されない。

実数

sprintf で %f  %lf は使えない。

float f;
char str[100];

dtostrv(f, 6, 1, str);    // 6 桁出力   小数点以下 1 桁


◆◆ LCD の使用方法 ◆◆


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

以下でも良いと思われる。