Skip to main content

Arduino互換ボード用のFirmata

note

この文書は AI によって翻訳されています。内容に不正確な点や改善すべき点がございましたら、文書下部のコメント欄または以下の Issue ページにてご報告ください。
https://github.com/Seeed-Studio/wiki-documents/issues

Firmataチュートリアル: Arduino互換ボードでFirmataを使用する方法

Firmataとは

Firmata は、組み込みシステムとホストコンピュータを接続する中間プロトコルであり、プロトコルチャネルとしてデフォルトでシリアルポートを使用します。ArduinoプラットフォームはFirmataの標準的なリファレンス実装です。Arduino IDEにはFirmataのサポートが組み込まれています。

これは、オンボードのArduino Coreを備えたOdyssey-X86と完全に連携します。つまり、Firmataプロトコルを使用して、さまざまなプログラミング言語でArduino Coreを簡単に制御できます。このチュートリアルでは、Windows OSをベースにしています。

参考: Firmata Protocols

Arduino IDEを使用してFirmataファームウェアを焼く

Arduino IDEバージョン1.6.X以降にはFirmataファームウェアが含まれているため、Arduino IDEを使用してArduino CoreにFirmataファームウェアを焼くことができます。

note

Arduino IDEはこちらからダウンロードできます。

  • Arduino IDEを開き、Examples -> Firmata -> StandardFirmataに移動します:
  • StandardFirmata.inoが表示されます。正しいボードとポートを選択し、Uploadをクリックします:
note

Odyssey用のボードライブラリをインストールしていない場合は、こちらを参照してインストールしてください。

  • アップロードが完了すると、次のように表示されます:

これで、Arduino FirmataファームウェアがOdyssey-X86のArduino Coreにフラッシュされました!

Firmataファームウェアのテスト

Firmataファームウェアをテストするには、Microsoft Storeに移動し、Windows Remote Arduino Experienceを検索してダウンロードします。ダウンロード後、USB接続、ボード、ボーレートを選択してArduino Coreに接続できます:

接続後、対応するピンにLEDを接続してファームウェアをテストできます:

Pythonを使用してFirmataを解釈する

Firmataプロトコルを実装するライブラリを使用すると、コンピュータ、スマートフォン、タブレットなどからマイクロコントローラプラットフォーム上で動作するFirmataファームウェアと通信できます。

pyFirmata はFirmataプロトコルのPythonインターフェースであり、Python3で動作します。

pyFirmataのインストール

note

Python3が必要です。

pipを使用してインストールします:

pip install pyfirmata

D13に接続されたLEDを点滅させる

注意: COM4をArduinoのUSB COMに変更してください。

シンプルなLEDモジュールの場合、Grove - LEDモジュールを使用してテストできます!

#!/usr/bin/env python3
from pyfirmata import Arduino, util
from time import sleep

board = Arduino('COM4') # ポートを変更してください
print("D13の点滅を開始します")
while True:
board.digital[13].write(1)
sleep(1)
board.digital[13].write(0)
sleep(1)

A0でアナログ信号を読み取る

#!/usr/bin/env python3
from pyfirmata import Arduino,util
import time
import sys

board = Arduino('COM4') # ポートを変更してください
it = util.Iterator(board)
it.start()
board.analog[0].enable_reporting()
print ("読み取り開始")
for i in range(10):
time.sleep(1)
print(board.analog[0].read())

board.analog[0].disable_reporting()

D6でPWM出力を行う

D6に接続されたLEDにPWM信号を出力します。

#!/usr/bin/env python3
from pyfirmata import Arduino, util
from time import sleep

board = Arduino('COM4') # ポートを変更してください
lenPin = board.get_pin('d:6:p') # PWMピン
print("PWM信号の出力を開始します")
while True:
for i in range(0, 101, 4):
lenPin.write(i/100)
sleep(0.05)
sleep(1)
for i in range(100, -1, -4):
lenPin.write(i/100)
sleep(0.05)
sleep(1)

これで、Pythonスクリプト(または他の言語)を使用してOdyssey-X86のArduino Coreを制御できるようになります。これは、リアルタイム要件がそれほど重要でない状況(例: Pythonを使用してWebサーバーを構築し、Arduinoでリレーを制御する場合)で非常に便利です。

注意: 詳細なAPIリファレンスについては、pyFirmata APIをご覧ください。

note

Firmataのより高度なPython使用法については、pymata4を検討してください。

JavaScriptを使用してFirmataを解釈する

Firmataプロトコルを介してArduino Coreを制御する際にPythonを使用するのと同様に、JavaScriptなどの他のプログラミング言語を選択することもできます!これは公式のFirmataチームによって実装されており、詳細はfirmata.jsで確認できます。

firmata.jsの使い方

note
    **`node.js`** がPCにインストールされていることを確認してください。
  • 新しいプロジェクトを作成します:
mkdir js && cd js
npm init -y
npm install --save firmata # firmata.jsをインストール

D13に接続されたLEDを点滅させる

const Board = require("firmata");
const pin = 13;

// 初期化
Board.requestPort((error, port) => {
if (error) {
console.log(error);
return;
}

const board = new Board(port.path);
// 接続待機
board.on("ready", () => {
console.log("準備完了!");
let state = 1;
// ピンを出力モードに設定
board.pinMode(pin, board.MODES.OUTPUT);
setInterval(() => {
console.log("状態変更");
board.digitalWrite(pin, (state ^= 1));
}, 500);
});
});

A0でアナログ信号を読み取る

アナログ信号をテストするには、Grove - Rotary Angle Sensorを使用することができます!

const Board = require('firmata');
const Pin = 0;

// 初期化
Board.requestPort(function(error, port) {
if (error) {
console.log(error);
return;
}
var board = new Board(port.path);
// 接続待機
board.on("ready", function() {
console.log("準備完了!");
// アナログ値を読み取る
board.analogRead(Pin, function(value) {
console.log("アナログ値: ", value);
});
});
});

D6でPWM出力を行う

var Board = require('firmata');
const LED = 6;

var brightness = 0;
var fadeAmount = 5;

// 初期化
Board.requestPort(function(error, port) {
if (error) {
console.log(error);
return;
}
const board = new Board(port.path);
// 接続待機
board.on("ready", function() {
console.log("準備完了!");
// ピンをPWMモードに設定
board.pinMode(LED, board.MODES.PWM);

// LEDのPWM信号
function fadeLed() {
brightness += fadeAmount;
if (brightness == 0 || brightness == 255) {
fadeAmount = -fadeAmount;
}
board.analogWrite(LED, brightness);
setTimeout(fadeLed, 30);
}
console.log("呼吸するような点滅");
fadeLed();
});
});

I2C信号

firmata.jsはI2CおよびUART通信もサポートしており、以下はGrove - 3-Axis Digital Accelerometer(ADXL345)(±16g)を使用した例です:

  • ハードウェア接続:
const Board = require("firmata");

Board.requestPort((error, port) => {
if (error) {
console.log(error);
return;
}

const register = {
POWER: 0x2D,
RANGE: 0x31,
READ: 0xB2,
};

const board = new Board(port.path);

board.on("ready", function() {
console.log("準備完了");

const adxl345 = 0x53;
const sensitivity = 0.00390625;

// I2Cを有効化
this.i2cConfig();

// 電源を切り替えてリセット
this.i2cWrite(adxl345, register.POWER, 0);
this.i2cWrite(adxl345, register.POWER, 8);

// 範囲を設定(これは2G範囲)
this.i2cWrite(adxl345, register.RANGE, 8);

// レジスタを読み取り位置に設定し、6バイトを要求
this.i2cRead(adxl345, register.READ, 6, data => {
const x = (data[1] << 8) | data[0];
const y = (data[3] << 8) | data[2];
const z = (data[5] << 8) | data[4];

// 16ビットをラップしてクランプ
const X = (x >> 15 ? ((x ^ 0xFFFF) + 1) * -1 : x) * sensitivity;
const Y = (y >> 15 ? ((y ^ 0xFFFF) + 1) * -1 : y) * sensitivity;
const Z = (z >> 15 ? ((z ^ 0xFFFF) + 1) * -1 : z) * sensitivity;

console.log("X: ", X);
console.log("Y: ", Y);
console.log("Z: ", Z);
});
});
});

注意: さらに詳しいAPIリファレンスについては、firmata.jsを訪問し、例を確認してください。

Loading Comments...