Arduino UNO
Arduino Nano
●CH340ドライバ
Windows
Mac
Android
Linux
開発環境
●Arduino IDE
https://www.arduino.cc/en/software
●ArduinoDroid
https://play.google.com/store/apps/details?id=name.antonsmirnov.android.arduinodroid2&hl=ja
●ブラウザ上でのコード実行テストpaiza.io ※ページ左上でC++を選択する
https://paiza.io/ja/projects/new
スケッチ
◆ArduinoIDEで定義されている定数 HIGH | LOW デジタル入出力の値 INPUT | OUTPUT デジタル入出力の向き B10101010 2進数(頭にBをつける) ◆データ型の注意 C言語の型に加え、下記も使用できます。 boolean または、bool 真trueか偽false byte 0~255 int -32768~32767(short2バイトになるので注意) unsigned int 0~65535(short2バイトになるので注意) word 0~65535 ◆デジタル入出力関数 pinMode(pin, mode); //pinには設定するピン番号、modeは、INPUT、OUTPUTなどを指定 digitalWrite(pin, value); //指定のピンの状態を変化させます。valueは、INPUT、OUTPUTを指定 digitalRead(pin); //指定のピンの状態を取得します。 ◆アナログ入出力関数 analogRead(pin); //0V~5Vの入力電圧を 0~1023の数値で返す analogWrite(pin, value); //0V~5Vの出力電圧を 0~1023の数値で指定 analogReference(type); アナログ入力で使われる基準電圧を設定 analogReadResolution(bits); analogRead()関数が返す値の分解能をbit単位で指定します。このパラメータの範囲は1から32。実際には12まで。 analogWriteResolution(bits); analogWrite()関数が返す値の分解能をbit単位で指定します。 ◆ポート操作 ポートB (デジタルピン8から13) ポートC (アナログピン) ポートD (デジタルピン0から7) DDRx:方向レジスタ 入力:0 出力:1 PORTx:データレジスタ LOW:0 HIGH:1 PINx:入力レジスタ(読み取り専用) DDRD = B11111110; //ピン設定 ピン0を入力、1~7を出力 PORTD = B10101000; //デジタルピン7,5,3をHIGH x = PIND; デジタルピン0~7を同時に読み取ることができます。 ◆その他の入出力関数 shiftOut(dataPin, clockPin, bitOrder, value); 1バイト分のデータを1ビットずつ「シフトアウト」します。 shiftIn(dataPin, clockPin, bitOrder); pulseIn(pin, value, timeout); ピンに入力されるパルスの時間を検出します。 tone(pin, frequency); 指定した周波数の矩形波(50%デューティ)を生成します。 noTone(pin); tone停止 ◆Stringクラス 文字列を連結、追加、置換、検索といった便利な操作を可能にするクラス。ただし、通常の配列型で扱うよりも多くのメモリを消費する。 String str = "de"; //Stringクラスを使い文字列を定義 str = "abc" + str + "fg"; //abcdefg if(str == "abcdefg") str = ""; //文字列を比較してstr内容を消去 byte buf[10]; str.getBytes(buf, 7); //文字列をbufに7文字コピー String str1 = str.substring(2, 3); //2文字目から3文字を代入。(from, to)どちらも省略可能。 上記は例にて、詳細はArduino日本語リファレンスを参照。 ◆時間に関する関数 millis(); プログラムの実行を開始した時から現在までの時間をミリ秒単位で返します。約50日間でオーバーフローし、ゼロに戻ります。 micros(); プログラムの実行を開始した時から現在までの時間をマイクロ秒単位で返します。約70分間でオーバーフローし、ゼロに戻ります。 delay(ms); ミリ秒待機 delayMicroseconds(us); マイクロ秒待機 ◆乱数に関する関数 randomSeed(seed); 疑似乱数ジェネレータを初期化 random(min, max); 疑似乱数を生成。minからmax-1の間の整数。 ◆ビットとバイトの操作 lowByte(x); 変数の下位1バイトを取り出す highByte(x); 変数の上位1バイトを取り出します(2バイトより大きな型に対しては、下位から2番目のバイトを取り出すことになります)。 bitRead(x, n); 指定したビットを読み取ります。x対象となる数, n右端からのビット位置 bitWrite(x, n, b); 指定したビットに書き込みます。b: 書き込むビット値(0または1) bitSet(x, n); 指定したビットをセット(1) bitClear(x, n); 指定したビットをクリア(0) bit(n); 指定したビットを1にしたときの値を計算します。bit(0)は1、bit(1)は2、bit(2)は4となります。 ◆外部割り込み attachInterrupt(interrupt, function, mode); 外部割り込みが発生したときに実行する関数を指定します。 //interrupt:割り込みを設定するピン番号 function:呼び出し先 mode:RISING立上がり,FALLING立下り,CHANGE両方, LOW detachInterrupt(interrupt); 指定した割り込みを停止します。 ◆割り込み interrupts(); noInterrupts関数によって停止した割り込みを有効にします。 noInterrupts(); 割り込みを無効にします。 ◆シリアル通信 UART 他のコンピュータやデバイスと通信するために、どのボードにも最低1つのシリアルポートが用意されています。ピン0と1がシリアルポートのピンで、この2ピンを通信に使用する場合、デジタル入出力として使うことはできません。 ArduinoIDEはシリアルモニタを備えていて、Arduinoとコミュニケーションすることができます。 Serial.begin(baud, config); シリアル通信のデータ転送レートをbps(baud)で指定します。Serial.begin(9600, SERIAL_8N1)のように2つ目のパラメータでデータ長、パリティの有無、ストップビットを設定することができます。 while(!Serial); //ポートが開くまで待つ Serial.end(); シリアル通信を終了し、RXとTXを汎用の入出力ピンとして使えるようにします。 Serial.available(); シリアルポートに何バイトのデータが到着しているかを返します。バッファは64バイトまで保持できます。 Serial.read(); 受信データを1バイト読み込みます。-1の場合は、データが存在しません。 Serial.peek(); 受信データを1バイト読み込みますが、バッファ中の読み取り位置は変更しません。 Serial.flush(); データの送信がすべて完了するまで待ちます。 Serial.print(data, format); ASCIIテキストでデータをシリアルポートへ出力します。 Serial.println(data, format); データの末尾にキャリッジリターンとニューラインを付けて送信します。 Serial.write(val); バイナリデータを出力します。1バイトずつ、あるいは複数バイトの送信が可能です。 .availableForWrite() 送信バッファの空き容量をバイト数で取得します。 ・UARTの送受信バッファはデフォルトでは64バイトに設定されています。 変更したい場合は、Arduino\hardware\arduino\avr\cores\arduino内にある HardwareSerial.h ファイルを スケッチと同じフォルダにコピーし変更します。 #define SERIAL_TX_BUFFER_SIZE 64 #define SERIAL_RX_BUFFER_SIZE 64 それぞれ送信、受信バッファサイズになり 64 を任意のサイズに変更します。 スケッチ内では修正したファイルをincludeして使用します。 ◆SoftwareSerial Arduinoボードの0~1番以外のピンを使ってシリアル通信を行うために開発されました。本来ハードウェアで実現されている機能をソフトウェアによって複製した。 #include <SoftwareSerial.h> SoftwareSerial mySerial(rxPin, txPin); //受信、送信ピンを指定 mySerial.begin(speed); //bps(baud)で指定 .available(); .isListening(); ソフトウェアシリアルポートが受信状態にあるかを調べます。 .overflow(); バッファのオーバーフローが発生していないかを調べます。ソフトウェアシリアルのバッファサイズは64バイトです。 .read(); 受信した文字を返します。(データがないときは -1) .print(data); ソフトウェアシリアルポートに対してデータを出力します。ASCII .println(data) .listen(); 指定したソフトウェアシリアルポートを受信状態にします。 .write(data); ソフトウェアシリアルポートに対してデータを出力します。バイナリ 複数のデバイスを切り替えて使用する場合は、下記のようにスケッチします。 ただし、切り替えていない側でデータが受信されても無視されます。 SoftwareSerial softSerial_1(2, 3); // rx, tx SoftwareSerial softSerial_2(4, 5); // rx, tx void setup() { softSerial_1.begin(9600); softSerial_2.begin(9600); } void loop() { softSerial_1.listen(); //ソフトシリアル1選択 softSerial_1.println("abc"); //ソフトシリアル1送信 softSerial_2.listen(); //ソフトシリアル2選択 softSerial_2.println("def"); //ソフトシリアル2送信 } ◆I2C マスターとスレーブがあり、マスター側で同期用クロック信号(SCL)、データの読み書きの指示を行う。 データは1本の線(SDA)によって送受信され、半二重通信となる。 スレーブは複数接続(最大112個)でき、それぞれ固有のアドレスを持っておりマスター側からコントロールされる。 通信速度は、100kbp~1Mbps。 SCL A5ピン SDA A4ピン ・接続されているスレーブのアドレスを検索して表示するスケッチ //I2CScanner #include <Wire.h> void setup() { Wire.begin(); Serial.begin(115200); while (!Serial); // Wait for starting serial monitor Serial.println("\nI2C Scanner"); } void loop() { byte error, address; int nDevices; Serial.println("Scanning..."); nDevices = 0; for(address = 1; address < 127; address++ ) { // The i2c_scanner uses the return value of // the Write.endTransmisstion to see if // a device did acknowledge to the address. Wire.beginTransmission(address); error = Wire.endTransmission(); if (error == 0) { Serial.print("I2C device found at address 0x"); if (address<16) { Serial.print("0"); } Serial.print(address,HEX); Serial.println(" !"); nDevices++; } else if (error==4) { Serial.print("Unknown error at address 0x"); if (address<16) Serial.print("0"); Serial.println(address,HEX); } } if (nDevices == 0) { Serial.println("No I2C devices found\n"); } else { Serial.println("done\n"); } delay(5000); // Wait 5 seconds for next scan } ◆SPI 信号線は4本で構成され、複数デバイスを接続できるがマスタ側にはスレーブを選択するためのSS線がデバイス分必要。 データは2本の線でそれぞれ送信、受信を行う全二重通信となる。 SCK シリアル・クロック MISO マスター・イン・スレーブ・アウト(CIPO) MOSI マスター・アウト・スレーブ・イン(COPI) SS スレーブ・セレクト(CS) ・ビットオーダー SPI.setBitOrder 最上位ビット(MSBFIRST)と最下位ビット(LSBFIRST)の、どちらから転送を行うか指定。 ・転送モード SPI.setDataMode クロック極性とクロック位相の組み合わせで4つのモードがあります。SPI_MODE0~4 クロック極性とは、アイドリング状態を示すクロックがHIGHかLOWか。 クロック位相とは、サンプリングがクロックの立ち上がりエッジか立ち下がりエッジか。 ・SPIの動作スピード SPI.setClockDivider 同期させるためのクロック信号の周波数を設定します。 システムクロックを分周した周波数になり、最小の分周比が1/2なのでシステムクロックが16MHzの場合は最大で8MHzとなる。 #include <SPI.h> void setup() { SPI.begin(); } void loop() { isFirst = false; SPI.beginTransaction(SPISetting(8000000, MSBFIRST, SPI_MODE0)); //SPI通信を開始 digitalWrite(SS, LOW); //デバイスに通信の開始を通知 SPI.transfer(0xaf); //1バイトを送信 digitalWrite(SS, HIGH); //デバイスに通信の終了を通知 SPI.endTransaction(); //SPI通信を終了 } ◆ソフトリセット ・アセンブラでジャンプ0 ※DueのようなARMコアでは動きません。 void software_reset() { asm volatile (" jmp 0"); } ・ウォッチドッグタイマーを使用 ◆EEPROM EEPROMに対する書き込みと読み込みを可能にします。電源を切っても内容が消えません。 #include <EEPROM.h> EEPROM.read(address); EEPROMから1バイト読み込みます。 EEPROM.write(address, value); EEPROMに1バイト書き込みます。