- 開発環境をつくる
- Arduinoでシリアルを受信する
- ArduinoのC/C++ シリアルエコーバック・プログラミング
- node-serialportでシリアルを送信する
- LeapMotionのイベントを送信する
- leapjsからイベントを取得して送信する
- ArduinoのC/C++ Lチカプログラミング
- 動作を確認
- Arduino を 書き込み器 (AVRライター)にする
- ArduinoISPをアップロード
- AVR の Boards Managerを追加
- Arduino と AVRを直接つなげる
- AVRでLチカ
- ArduinoのC/C++ AVRのLチカプログラミング
- AVRにアップロード
- ArduinoのC/C++ パススルー・プログラミング
- ブレッドボードで電子回路をつくる
下記の用語は読み替えをお願いします
- AVR : ATtiny85
- Arduino : ArduinoUno
AVRとのUSART通信にArduinoをつかってみたら思った以上にC/C++(.ino)の編集が増えたました、すいませんm(__)m
- sample.js : 実行ファイル
- SerialEvent.ino : シリアルイベントのサンプルファイル(編集しません)
- SerialEventLed.ino : シリアルイベントのサンプルファイルをもとにLED処理を追加したもの
- ArduinoISP.ino : Arduino を 書き込み器にするためのもの(編集しません)
- SoftwareSerialExample.ino : シリアルイベントのサンプルファイル(ボーレートとピン番号を変更)
- SerialEventLedAVR.ino : SerialEventLedをもとにAVRにピン位置とボーレートを変更したもの
このサンプルではArduinoでUSBのシリアル変換と、AVRの焼き込みで2種類の使い方をしてます(オ
- ArduinoIDEのインストール https://www.arduino.cc/en/Main/Software
- Node.Jsのインストール
https://nodejs.org/en/
- Mac Homebrewの場合:
brew install node
- Windows chocolateyの場合:
choco install nodejs.install
- Mac Homebrewの場合:
- LeapMotionSDKのインストール https://developer.leapmotion.com/
- まずArduinoIDEをひらきます。
- ArduinoとPCをUSBでつなぎ、ArduinoIDEのFile -> Examples -> 04.Communication -> SerialEventをひらきます。
- Tools -> Board: -> Arduino/Genuino Unoを選択
- Tools -> Port から接続しているArduinoボードを選択、Mac/Linuxは/dev/tty、WindowsはCOM1など
- Tools -> Programmer -> AVR ISP を選択
- Upload ボタンをおしてArduinoに書き込みます
- 作業フォルダを作成して移動
cd nodeSerialExample
- serialportをダウンロード
npm install serialport
- JavaScriptでプログラムを作成
- 例は3秒ごとに文字列”a”を送信して受信データをコンソールに出力するプログラム(sample.js)
- シリアルポートのパスを編集して実行( Macの場合
ls /dev/tty.usb*
)
var SerialPort = require("serialport").SerialPort;
var serialPort = new SerialPort(
"/dev/tty-usbserial1" // パスを指定する(Mac/Linuxは/dev/tty、WindowsはCOM1など)
);
function showPortOpen() {
serialPort.on('data', function (data) {
console.log('受信データ: ' + data);
});
setInterval(function () {
sendSerialData();
}, 3000);
}
function sendSerialData() {
serialPort.write("a", function (err, results) {
if (err) console.log('err ' + err);
console.log('送信データのカウント数 ' + results);
});
}
serialPort.on("open", showPortOpen);
実行結果 ※エディタによっては日本語の文字化けるかも
node sample.js
送信データのカウント数 1
COM1や/dev/ttyというのは標準入出力になってる端末デバイスのファイルのことです(オ
流れ
PC(Mac) --- COM1(/dev/tty) --- RS-232(不明) --- Arduino
- USART (Universal Synchronous and Asynchronous serial Receiver and Transmitter)
- RS-232 (Recommended Standard 232)
- LeapMotionとPCをUSBで接続
- leapjsをダウンロード
npm install leapjs
- sample.jsに処理を追加
- 例は手を検知したら文字列”a”を送信する処理を追加
@@ -2,21 +2,35 @@
var serialPort = new SerialPort(
"/dev/tty-usbserial1" // パスを指定する(Mac/Linuxは/dev/tty、WindowsはCOM1など)
);
+var isResume = true;
function showPortOpen() {
serialPort.on('data', function (data) {
console.log('受信データ: ' + data);
});
- setInterval(function () {
- sendSerialData();
- }, 3000);
}
function sendSerialData() {
+ isResume = false;
serialPort.write("a", function (err, results) {
if (err) console.log('err ' + err);
console.log('送信データのカウント数 ' + results);
});
+ setTimeout(function () {
+ isResume = true;
+ }, 1000); //1秒間の遅延
}
serialPort.on("open", showPortOpen);
+
+require('leapjs/template/entry');
+
+var controller = new Leap.Controller({
+ background : true
+});
+controller.on("frame", function (frame) {
+ var hand = frame.hands[0];
+ if (!hand || !isResume) return;
+ sendSerialData(); // 手を検知したらシリアルを送信する
+});
+controller.connect();
+console.log("\nデバイスと通信待ち");
- ArduinoIDEに戻って、さっきのSerialEvent.inoを別名保存で編集
- Arduinoにアップロード
例はSerialEventにLチカの処理を追加したプログラム(SeriaEventLED.ino)
boolean isLighting = true;
void setup() {
// initialize serial:
Serial.begin(9600);
while (!Serial) {
}
Serial.println("HelloWorld?");
pinMode(13, OUTPUT);
}
void loop() {
while (Serial.available()) {
char reciveData = (char)Serial.read();
if (reciveData) isLighting = !isLighting;
}
if (isLighting) {
digitalWrite(13, HIGH);
}
else {
digitalWrite(13, LOW);
}
}
実行結果
node sample.js
デバイスと通信待ち
Optimized for desktop usage.
受信データ: He
受信データ: lloW
受信データ: orld
受信データ: ?
- ポートを開けるためnodeを終了します。
- ArduinoIDEのFile -> Examples -> ArudinoISP をひらきます
- Upload ボタンをおしてArduinoに書き込みます
- pin name: not-mega
- slave reset: 10
- MOSI: 11
- MISO: 12
- SCK: 13
- pin name: mega(1280 and 2560)
- slave reset: 53
- MOSI: 51
- MISO: 50
- SCK: 52
- (ATtiny85の場合)Arduino -> Preferences..を選択して、[Additional Boards Manager URLs]に下記URLを追加し[OK]を選択
https://raw.githubusercontent.com/damellis/attiny/ide-1.6.x-boards-manager/package_damellis_attiny_index.json
- Tools -> Board: -> Boards Manager…を選択して、Boards Manager の中から [attiny by David A. Mellls] をインストール
ATtiny85
ATmega328P
ArduinoUnoとかにはハードウェアシリアルが用意されてるけど、AVRにはないのでシリアル通信をソフトウェアで処理します。あとAVRにあわせてピン数とボーレートを変えます。ボーレート(baud rate)は 1 秒の変調回数の単位で、フランスの技術者Émile Baudotさんの名前からだそうです(オ
- ArduinoIDEに戻って、SerialEventLedを別名保存します。
- SoftwareSerialをインクルードして、ピン位置とボーレートを変更(SerialEventLedAVR.ino)
- サンプルはデータを受信したらOnOffを切り替えるって処理だけになってますが、文字をしっかり受信するときは、ノイズで壊れやすいので、チェック処理など入れる必要があります。
- ArduinoUno
- RX 10 pin
- TX 11 pin
- baud rate 9600
- AVR
- RX 3 pin
- TX 1 pin
- baud rate 4800
@@ -1,23 +1,26 @@
+#include <SoftwareSerial.h>
+
+SoftwareSerial mySerial(3, 1); // RX, TX;
boolean isLighting = true;
void setup() {
// initialize serial:
- Serial.begin(9600);
- while (!Serial) {
+ mySerial.begin(4800);
+ while (!mySerial) {
}
- Serial.println("HelloWorld?");
- pinMode(13, OUTPUT);
+ mySerial.println("HelloWorld?");
+ pinMode(2, OUTPUT);
}
void loop() {
- while (Serial.available()) {
- char reciveData = (char)Serial.read();
+ while (mySerial.available()) {
+ char reciveData = (char)mySerial.read();
if (reciveData) isLighting = !isLighting;
}
if (isLighting) {
- digitalWrite(13, HIGH);
+ digitalWrite(2, HIGH);
}
else {
- digitalWrite(13, LOW);
+ digitalWrite(2, LOW);
}
}
- ArduinoIDEのTools -> Board: -> Atinnyを選択
- Tools -> Processor:"Atinny85"を選択
- Tools -> Programmer -> Arduino as ISP を選択
- Sketch -> Upload Using Programmer 選択してAVRに書き込みます
流れ
PC(Mac) --- COM1(/dev/tty) --- RS-232(不明) --- Arduino --- USART --- AVR
PCとAVRとをUSARTで接続するのにArduinoをアダプタにします。
- ArduinoIDEのFile -> Examples -> SoftwareSerial -> SoftwareSerialExample をひらきます
- ボーレートの変更と文字列'a'を受信したらaを送信する条件分岐を追加
- Tools -> Board: -> Arduino/Genuino Unoを選択
- Tools -> Port から接続しているArduinoボードを選択
- Tools -> Programmer -> AVR ISP を選択
- Upload ボタンをおしてArduinoに書き込みます
SoftwareSerialExample
@@ -32,7 +32,7 @@
void setup()
{
// Open serial communications and wait for port to open:
- Serial.begin(57600);
+ Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for Leonardo only
}
@@ -47,9 +45,10 @@
void loop() // run over and over
{
- if (mySerial.available())
+ while (mySerial.available())
Serial.write(mySerial.read());
- if (Serial.available())
- mySerial.write(Serial.read());
+ while (Serial.available()) {
+ char message = (char)Serial.read();
+ if (message == 'a') mySerial.print('a');
+ }
}