2016年4月29日金曜日

Johnny-Fiveでマイコン制御4 - GPS

○使用部品

出力形式がNMEA(NMEA 0183)、ボーレート9600bpsのGPSモジュールなら、同じように使えるかと思われます。

○GPS制御用端子
Arduino TX、RX、3.3V、GND
Raspberry Pi 1、6、8、10

○基本回路/プログラム
◇Arduino
・配線
モジュール
Arduino
RX
10
TX
11
VCC
3.3V
GND
GND

・プログラム

◇Raspberry Pi
Raspberry Piでは、Johnny-Fiveを使ってGPSと通信することができないため、代替えの方法を紹介します。

※Raspberry Pi 3では動作しません。

・シリアルコンソールの無効化
 次のように操作して、シリアルコンソールを無効に設定します。
①[Menu]→[設定]→[Raspberry Piの設定]を選択します。
②「インターフェイス」タブを選択し、シリアルを無効に設定し、[OK]をクリックします。
 
③[はい]をクリックして、再起動します。

・「serialport」と「node-nmea」モジュールのインストール
 次のように操作して、「serialport」と「node-nmea」モジュールをインストールします。
①ターミナルを起動し、作業用のフォルダに移動します。
②「npm install serialport node-nmea[Enter]」と入力します。

・配線
モジュール
Raspberry Pi
RX
8
TX
10
VCC
1
GND
6
※物理的なピン番号で表記しています。

・プログラム
var serialport = require('serialport');
var nmea = require('node-nmea');
var port = new serialport.SerialPort(
'/dev/ttyAMA0', {
baudrate: 9600,
parser: serialport.parsers.readline('\r\n')
}
);
port.on('data', function(line) {
//console.log(nmea.parse(line));
var dat = nmea.parse(line);
if (dat.loc != null) {
var lat = dat.loc.geojson.coordinates[0];
var lon = dat.loc.geojson.coordinates[1];
console.log("position");
console.log(" latitude : ", lat);
console.log(" longitude : ", lon);
}
});
view raw gps_pi.js hosted with ❤ by GitHub


 

Johnny-Fiveでマイコン制御3 - Wiiヌンチャク

  




○使用部品
Wiiヌンチャク

○Wiiヌンチャク制御用端子
Arduino A2、A3、A4、A5
Raspberry Pi 3、4(または2)、5、6

○基本回路/プログラム
◇Arduino
・配線
アダプタ
Arduino
-
A2
+
A3
d
A4
c
A5

◇Raspberry Pi
・配線
アダプタ
Raspberry Pi()
-
6
+
4
d
3
c
5
※物理的なピン番号で表記しています。
 
・プログラム
var raspi = require('raspi-io');
var five = require("johnny-five"),
board, nunchuk;
board = new five.Board({
io: new raspi()
});
board.on("ready", function() {
// Create a new `nunchuk` hardware instance.
nunchuk = new five.Wii.Nunchuk({
freq: 50
});
nunchuk.joystick.on("change", function(event) {
console.log(
"joystick " + event.axis,
event.target[event.axis],
event.axis, event.direction
);
});
nunchuk.accelerometer.on("change", function(event) {
console.log(
"accelerometer " + event.axis,
event.target[event.axis],
event.axis, event.direction
);
});
["down", "up", "hold"].forEach(function(type) {
nunchuk.on(type, function(event) {
console.log(
event.target.which + " is " + type,
{
isUp: event.target.isUp,
isDown: event.target.isDown
}
);
});
});
});
view raw nunchuk_pi.js hosted with ❤ by GitHub


APIの詳細は、Arduinoのプログラムを参照してください。

2016年4月28日木曜日

Johnny-Fiveでマイコン制御2 - LCD

○使用LCD
・パラレル接続
1602 16x2 Character LCD Display Module Blue Blacklight
・I2C接続
waves 1602 IIC/I2C/TWI LCD液晶 モジュール Arduino 青


○LCD制御用端子
Arduino 0~13
Raspberry Pi(※) GPIO04~026

※Model A+/B+/Raspberry Pi 2/ Raspberry Pi 3/Raspberry Pi Zero

○基本回路/プログラム

★パラレル接続
◇Arduino
・配線
 

・プログラム

◇Raspberry Pi
・配線
 

・プログラム
raspi = require('raspi-io');
var five = require("johnny-five");
var board = new five.Board({io: new raspi()});
board.on("ready", function() {
var random = Math.random().toString(36).replace(/[^a-z]+/g, "").substr(0, 4).toUpperCase();
// Controller: PARALLEL (default)
var p = new five.LCD({
pins: ['P1-7', 'P1-8', 'P1-10', 'P1-11', 'P1-12', 'P1-13'],
backlight: 10,
});
p.useChar("heart");
p.cursor(0, 0).print("hello :heart:");
p.blink();
p.cursor(1, 0).print("Blinking? ");
p.cursor(0, 10).print(random);
setTimeout(function() {
process.exit(0);
}, 3000);
})




I2C接続
Arduino
・配線
モジュール
Arduino
GND
GND
VCC
VCC
SDA
A4
SCL
A5
 ・プログラム

◇Raspberry Pi
・配線
モジュール
Raspberry Pi()
GND
6
VCC
2
SDA
3
SCL
5
※物理的なピン番号で表記しています。

・プログラム
raspi = require('raspi-io');
var five = require("johnny-five");
var board = new five.Board({io: new raspi()});
board.on("ready", function() {
var random = Math.random().toString(36).replace(/[^a-z]+/g, "").substr(0, 4).toUpperCase();
// Controller: PCF8574A (Generic I2C)
// Locate the controller chip model number on the chip itself.
var l = new five.LCD({
controller: "PCF8574A"
});
l.useChar("heart");
l.cursor(0, 0).print("Hello :heart:");
l.blink();
l.cursor(1, 0).print("Blinking? ");
l.cursor(0, 10).print(random);
setTimeout(function() {
process.exit(0);
}, 3000);
});




2016年4月27日水曜日

Johnny-Fiveでマイコン制御1 - サーボモーター

○サーボモーター制御用端子(PWM出力端子)
Arduino 3、5、6、10、11
Raspberry Pi(※) 12、32、33、35
※Model A+/B+/Raspberry Pi 2/ Raspberry Pi 3/Raspberry Pi Zero

○基本回路/プログラム

◇Arduino
・配線
・プログラム


◇Raspberry Pi
・配線


・プログラム
var raspi = require('raspi-io');
var five = require("johnny-five");
var board = new five.Board({io: new raspi()});
board.on("ready", function() {
var servo = new five.Servo('P1-12');
this.repl.inject({
servo: servo
});
servo.sweep();
});

※オプション、APIはArduinoのプログラムを参照してください。


○PWMパルス幅の設定
 ArduinoとRaspberry Piでは、PWMの周期が異なるため、サーボモーターの回転角度が違ってきます。調整する方法はないかと調べてみると、「pwmRange」オプションでPWMのパルス幅を調整できることが分かりました。

・オプション書式
pwmRange:[最小パルス幅, 最大パルス幅]

・プログラム(Raspberry Pi用)

var raspi = require('raspi-io');
var five = require("johnny-five");
var board = new five.Board({io: new raspi()});
board.on("ready", function() {
var servo = new five.Servo({
pin: 'P1-12',
pwmRange:[600, 2200]
});
this.repl.inject({
servo: servo
});
servo.sweep();
});

 サーボモーターの種類にもよりますが、規定のままではArduinoでも回転角度がズレる場合があるので、必要に応じて、「pwmRange」オプションで調整してください。



2016年4月25日月曜日

ArduinoとESP8266ではじめる IoTプログラミング

本書は、ESP8266とArduinoを使用して、無線化IoTシステムを構築するための基礎を解説しています。

2016年4月19日火曜日

kindle本 無料で試すIoTプラットフォーム-JavaScript偏(Arduino/Raspberry Pi対応)

 既刊の「ArduinoとJavaScriptではじめるIoTプログラミング」と「Raspberry PiとJavaScriptではじめるIoTプログラミング」の続編です。 ハードウェアデバイスにArduinoとRaspberry Piを、開発言語にJavaScript(Node.js)を使用し、無料で利用できるIoTプラットフォームの「M2X」「ThingSpeak」「thethings.iO」「carriots」「dweet.io」の基本的な使い方を解説しています。

2016年4月7日木曜日

ubidots ESP8266ライブラリ

 ubidotsのESP8266ライブラリを使えるように書き換えてみました。


※画像はデータ取得の例です。

 動作確認したESP8266、ESP-WROOM-02のファームウェアのバージョンは以下です。

AT version:0.40.0.0(Aug  8 2015 14:45:58)
SDK version:1.3.0


○ライブラリのインストール
 ArudinoIDE(1.6.8)でライブラリをインストールするには、次のように操作します。

ESP8266ライブラリをダウンロードします。
②ArudinoIDEを起動します。
③[スケッチ]→[ライブラリをインクルード]→[.ZIP形式のライブラリをインストール]を選択します。
④ダウンロードしたESP8266ライブラリのZIPファイルを選択し、[開く]をクリックします。


○ボーレートの設定
 SoftwareSerialを使用しているので、ESP8266のボーレートを9600bpsに設定する必要があります。

 ボーレートを9600bpsに設定するには、次のATコマンドを入力します。

  AT+UART_DEF=9600,8,1,0,0

 元の115200bpsに戻すには、次のATコマンドを入力します。

  AT+UART_DEF=115200,8,1,0,0
 
 「AT+UART_DEF」の書式は、次のとおりです。

  AT+UART_DEF=<ボーレート>, <データビット数>,<ストップビット>, <パリティ>,<フロー制御>


 PCとESP8266の接続方法、端末ソフトの設定は、以下の記事を参照してください。
Arduino+ESP8266でIoT

 ESP-WROOM-02(スイッチサイエンス)の場合は、次の表のように配線します。

GNDGND
EN10kΩ抵抗経由で3.3V
RST10kΩ抵抗経由で3.3V
TXDシリアル変換ケーブル白
RXDシリアル変換ケーブル緑
VCC3.3V



○ArudinoとESP8266の接続

 ArudinoとESP8266を次のように接続します。

ArduinoESP8266
D2TXD
D3RXD
3.3VVCC
3.3VCH_PD
GNDGND


 ESP-WROOM-02の場合は、次のように接続します。

ArduinoESP-WROOM-02
D2TXD
D3RXD
GNDGND

 VCCは3.3V電源(Arudinoの3.3Vではドライブ不可)、EN、RSTは、10kΩ抵抗経由で3.3Vに接続します。


○プログラム(スケッチ)の例
 データを送信するコードは、次のように書きます。

#include <UbidotsESP8266.h>
#include <SoftwareSerial.h>
#define SSID "Your_WiFi_SSID_here"
#define PASS "Your_WiFi_PASWORD_here"
#define TOKEN "Your_token_here"
#define ID "Your_VariableID_here"
Ubidots client(TOKEN);
void setup() {
Serial.begin(9600);
client.wifiConnection(SSID,PASS);
client.tcpConnection();
}
void loop() {
float value = analogRead(A0);
client.saveValue(ID,value);
}

 その他の使い方は、README、サンプルを参照してください。



2016年4月6日水曜日

Arduino+ESP8266でIoT-ubidots偏

 今回は、Arduino+ESP8266で、ubidotsにデータを送信するプログラム(スケッチ)を書いてみました。

 ubidotsのデータソース(Source)、変数(Variable)の作成方法については、以下記事を参照してください。

Arduino+ubidotsでセンサー・データをリアルタイムで可視(グラフ)化する


#include <ArduinoJson.h>
int ERRLED =11;
String SSID = "<SSID>";
String PASS = "<Password>";
String TOKEN = "<Token>";
String SERVER = "things.ubidots.com";
int PORT = 80;
String ID = "<Variable ID>";
String uri= "/api/v1.6/variables/" + ID + "/values";
void setup() {
pinMode(ERRLED, OUTPUT);
Serial.begin(115200);
Serial.println("AT");
if (!Serial.find("OK")) digitalWrite(ERRLED, HIGH);
// Connect Wifi
Serial.println("AT+CWJAP=\"" + SSID + "\",\"" + PASS + "\"");
delay(10000);
if (!Serial.find("OK")) digitalWrite(ERRLED, HIGH);
// Open TCP connection to the host:
Serial.println("AT+CIPSTART=\"TCP\",\"" + SERVER + "\"," + PORT);
delay(50);
if (!Serial.find("OK")) digitalWrite(ERRLED, HIGH);
}
void loop() {
float val = analogRead(A0);
// Reserve memory space
StaticJsonBuffer<200> jsonBuffer;
// Build object tree in memory
JsonObject& dat = jsonBuffer.createObject();
dat["value"] = val;
String value;
dat.printTo(value);
value += "\r\n";
int contentlength = value.length();
// Construct our HTTP call
String httpPacket = "POST " + uri + " HTTP/1.1\r\nHost: " + SERVER + "\r\nX-Auth-Token: "+ TOKEN +"\r\nContent-Length: " + contentlength + " \r\nContent-Type: application/json\r\n\r\n" + value +"\r\n";
int length = httpPacket.length();
// Send our message length
Serial.print("AT+CIPSEND=");
Serial.println(length);
delay(10); // Wait a little for the ESP to respond
// check if the ESP is running well
if (!Serial.find(">")) digitalWrite(ERRLED, HIGH);
// Send our http request
Serial.print(httpPacket);
delay(10); // Wait a little for the ESP to respond
// check if the ESP is running wel
if (!Serial.find("SEND OK\r\n")) digitalWrite(ERRLED, HIGH);
delay(10000); // wait 10 seconds before updating
}

<SSID>には、WiFiのSSIDを、<Password>にはWiFiのパスワードを入力します。
<Token>にはTokenを、<Variable ID>にはVariable IDを入力します。
Tokenは、ubidotsのメニューのユーザー名をクリックし、「API Credentials」を選択すると、確認できます。



 ubidotsには、ESP8266のライブラリが用意されていますが、そのライブラリは、まったく使い物になりませんでした。

2016年4月2日土曜日

Arduino+ESP8266でIoT-IFTTTのMakerにデータをPOST

 今回は、Arduino+ESP8266のIoTデバイスから、IFTTTのMakerにデータをPOST(送信)するプログラム(スケッチ)を作成してみました。IFTTTにデータをPOSTできれば、Googleドライブに記録したり、Twettrにつぶやくことも簡単にできるので、やれることに幅が広がります。

  IFTTTのMakerの作成方法は、「IFTTTを使ってセンサー・データをGoogleドライブ(スプレッドシート)に記録する(Arduino編)」を参照してください。


#include <ArduinoJson.h>
int errorLED = 11;
String ssid = "<SSID>"; // wifi SSID
String password = "<Password>"; // wifi password
String host = "maker.ifttt.com";
const int httpPort = 80;
String key = "<key>"; // Your IFTTT Maker key
String event = "<EventName>"; // Your IFTTT event name
String uri = "/trigger/" + event + "/with/key/" + key;
void setup() {
pinMode(errorLED, OUTPUT);
// Start our ESP8266 Serial Communication
Serial.begin(115200);
Serial.println("AT");
delay(5000);
if (!Serial.find("OK")) digitalWrite(errorLED, HIGH);
// Connect to Wifi
Serial.println("AT+CWJAP=\"" + ssid + "\",\"" + password + "\"");
delay(10000);
if (!Serial.find("OK")) digitalWrite(errorLED, HIGH);
// Open TCP connection to the host:
Serial.println("AT+CIPSTART=\"TCP\",\"" + host + "\"," + httpPort);
delay(50);
if (!Serial.find("OK")) digitalWrite(errorLED, HIGH);
}
void loop() {
// Reserve memory space
StaticJsonBuffer<200> jsonBuffer;
// Build object tree in memory
JsonObject& dat = jsonBuffer.createObject();
// set data to sending
dat["value1"] = "<value>";
// set opitinal data to sending
// dat["value2"] = value; // optional
// dat["value3"] = value; // optional
String value;
dat.printTo(value);
value += "\r\n";
int contentlength = value.length();
// Construct our HTTP call
String httpPacket = "POST " + uri + " HTTP/1.1\r\nHost: " + host + "\r\nContent-Length: " + contentlength + " \r\nContent-Type: application/json\r\n\r\n" + value +"\r\n";
int length = httpPacket.length();
// Send our message length
Serial.print("AT+CIPSEND=");
Serial.println(length);
delay(10);
if (!Serial.find(">")) digitalWrite(errorLED, HIGH);
// Send our http request
Serial.print(httpPacket);
delay(10);
if (!Serial.find("SEND OK\r\n")) digitalWrite(errorLED, HIGH);
delay(10000);
}
※「Arduinojson」をインストールしてください。


 <SSID>にはWiFiのSSIDを、<Password>にはWiFiのパスワードを入力します。

 <key>にはIFTTTのMakerのkeyを、<EventName>には、IFTTTのEventの名前を入力します。



 










 46行目の「dat["value1"] =  "<value>";」の<value>には、送信するデータを指定します。
 データは、value1、value2、value3の3つを送信することができます。必要に応じて、value2、value3を指定します。


 たとえば、Arudinoで計測した温度データを送信するプログラム(スケッチ)は、次のようになります。

#include <ArduinoJson.h>
int sensorPin = 0;
int errorLED = 11;
String ssid = "<SSID>"; // wifi SSID
String password = "<Password>"; // wifi password
String host = "maker.ifttt.com";
const int httpPort = 80;
String key = "<key>"; // Your IFTTT Maker key
String event = "<EventName>"; // Your IFTTT event name
String uri = "/trigger/" + event + "/with/key/" + key;
void setup() {
pinMode(errorLED, OUTPUT);
// Start our ESP8266 Serial Communication
Serial.begin(115200);
Serial.println("AT");
delay(5000);
if (!Serial.find("OK")) digitalWrite(errorLED, HIGH);
// Connect to Wifi
Serial.println("AT+CWJAP=\"" + ssid + "\",\"" + password + "\"");
delay(10000);
if (!Serial.find("OK")) digitalWrite(errorLED, HIGH);
// Open TCP connection to the host:
Serial.println("AT+CIPSTART=\"TCP\",\"" + host + "\"," + httpPort);
delay(50);
if (!Serial.find("OK")) digitalWrite(errorLED, HIGH);
}
void loop() {
int reading = analogRead(sensorPin);
float voltage = reading * 5.0 / 1024.0;
float temperatureC = voltage * 100;
// Reserve memory space
StaticJsonBuffer<200> jsonBuffer;
// Build object tree in memory
JsonObject& dat = jsonBuffer.createObject();
// set data to sending
dat["value1"] = temperatureC;
// set opitinal data to sending
// dat["value2"] = value; // optional
// dat["value3"] = value; // optional
String value;
dat.printTo(value);
value += "\r\n";
int contentlength = value.length();
// Construct our HTTP call
String httpPacket = "POST " + uri + " HTTP/1.1\r\nHost: " + host + "\r\nContent-Length: " + contentlength + " \r\nContent-Type: application/json\r\n\r\n" + value +"\r\n";
int length = httpPacket.length();
// Send our message length
Serial.print("AT+CIPSEND=");
Serial.println(length);
delay(10)
if (!Serial.find(">")) digitalWrite(errorLED, HIGH);
// Send our http request
Serial.print(httpPacket);
delay(10);
if (!Serial.find("SEND OK\r\n")) digitalWrite(errorLED, HIGH)
delay(10000);
}