Skip to content

Instantly share code, notes, and snippets.

@K90j1
Last active January 21, 2023 13:30
Show Gist options
  • Save K90j1/9e8eb3e2b2a5f9717fa8 to your computer and use it in GitHub Desktop.
Save K90j1/9e8eb3e2b2a5f9717fa8 to your computer and use it in GitHub Desktop.

目次

  • 開発環境をつくる
  • 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種類の使い方をしてます(オ

開発環境

  1. ArduinoIDEのインストール https://www.arduino.cc/en/Main/Software
  2. Node.Jsのインストール https://nodejs.org/en/
    • Mac Homebrewの場合: brew install node
    • Windows chocolateyの場合: choco install nodejs.install
  3. LeapMotionSDKのインストール https://developer.leapmotion.com/

Arduinoでシリアルを受信する

ArduinoのC/C++ シリアルエコーバック・プログラミング

  1. まずArduinoIDEをひらきます。
  2. ArduinoとPCをUSBでつなぎ、ArduinoIDEのFile -> Examples -> 04.Communication -> SerialEventをひらきます。 Imgur Imgur Imgur Imgur
  3. Tools -> Board: -> Arduino/Genuino Unoを選択 Arduino/Genuino Unoを選択 Arduino/Genuino Uno
  4. Tools -> Port から接続しているArduinoボードを選択、Mac/Linuxは/dev/tty、WindowsはCOM1など
  5. Tools -> Programmer -> AVR ISP を選択 AVR ISPISP
  6. Upload ボタンをおしてArduinoに書き込みます ArduinoISP

node-serialportでシリアルを送信

  1. 作業フォルダを作成して移動 cd nodeSerialExample
  2. serialportをダウンロード npm install serialport
  3. JavaScriptでプログラムを作成
    • 例は3秒ごとに文字列”a”を送信して受信データをコンソールに出力するプログラム(sample.js)
  4. シリアルポートのパスを編集して実行( 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のイベントを送信する

leapjsからイベントを取得してシリアルに変換

  1. LeapMotionとPCをUSBで接続
  2. leapjsをダウンロード npm install leapjs
  3. 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デバイスと通信待ち");

ArduinoのC/C++ Lチカプログラミング

  1. ArduinoIDEに戻って、さっきのSerialEvent.inoを別名保存で編集
  2. 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);
  }
}

動作を確認

  1. sample.jsを実行 node sample.js
  2. 手をかざしてpin13 LEDの点灯を確認します led

実行結果

node sample.js
デバイスと通信待ち
Optimized for desktop usage.
受信データ: He
受信データ: lloW
受信データ: orld
受信データ: ?

Arduinoを書き込み器(AVRライター)にする

ArduinoISPをアップロード

  1. ポートを開けるためnodeを終了します。
  2. ArduinoIDEのFile -> Examples -> ArudinoISP をひらきます
  3. 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

AVR の Boards Managerを追加

  1. (ATtiny85の場合)Arduino -> Preferences..を選択して、[Additional Boards Manager URLs]に下記URLを追加し[OK]を選択 Preferences..を選択dditional Boards Manager URLshttps://raw.githubusercontent.com/damellis/attiny/ide-1.6.x-boards-manager/package_damellis_attiny_index.json
  2. Tools -> Board: -> Boards Manager…を選択して、Boards Manager の中から [attiny by David A. Mellls] をインストールBoards Manager…を選択attiny by David A. Mellls

Arduino と AVRを直接つなげる

  1. ArduinoとAtinnyをつなげる Writter

ATtiny85

Imgur

ATmega328P

Imgur

AVRでLチカ

ArduinoのC/C++ AVRのLチカプログラミング

ArduinoUnoとかにはハードウェアシリアルが用意されてるけど、AVRにはないのでシリアル通信をソフトウェアで処理します。あとAVRにあわせてピン数とボーレートを変えます。ボーレート(baud rate)は 1 秒の変調回数の単位で、フランスの技術者Émile Baudotさんの名前からだそうです(オ

  1. ArduinoIDEに戻って、SerialEventLedを別名保存します。
  2. 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);
   }
 }

AVRに書き込み

  1. ArduinoIDEのTools -> Board: -> Atinnyを選択 Imgur
  2. Tools -> Processor:"Atinny85"を選択 Imgur
  3. Tools -> Programmer -> Arduino as ISP を選択 Imgur
  4. Sketch -> Upload Using Programmer 選択してAVRに書き込みます Imgur

流れ

PC(Mac) --- COM1(/dev/tty) --- RS-232(不明) --- Arduino --- USART --- AVR

ArduinoのC/C++ パススルー・プログラミング

PCとAVRとをUSARTで接続するのにArduinoをアダプタにします。

  1. ArduinoIDEのFile -> Examples -> SoftwareSerial -> SoftwareSerialExample をひらきます
  2. ボーレートの変更と文字列'a'を受信したらaを送信する条件分岐を追加
  3. Tools -> Board: -> Arduino/Genuino Unoを選択
  4. Tools -> Port から接続しているArduinoボードを選択
  5. Tools -> Programmer -> AVR ISP を選択
  6. 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');
+  }
 }

ブレッドボードで電子回路をつくる

  1. Lチカの電子回路をつくる Imgur
  2. sample.jsを実行 node sample.js
  3. ブラウザでサンプルファイルを開く node_modules/leapjs/examples/threejs-bones.html

おつかれさまでした!!

参考サイト

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment