2016年08月29日

2つのIDE

Arduino IDE には 1.6.10 と 1.7.10 があります。この違いは何なのでしょうか?
ヘルプを見るとわかりますが出所が異なります。
Arduino 1.6.10
cc_Help.jpg

Arduino 1.7.10
org_Help.jpg

本家○○、と元祖□□と言ってるようなものですね!

何が違うのか良く分かりませんね!
対象となるボードに違いを見つけることができます。
Arduino.cc ボード
cc_Board.jpg

Arduino.org ボード
org_Bord.jpg

どちらも意欲的に新しいボードをリリースしようとしています。
Arduino.org からは今までの Atmel 社以外のCPU を積んだArduino STAR OTTO (STM32F469を積んだボード)
A000135-Arduino-Star-Otto-1front.jpg
http://www.arduino.org/products/boards/arduino-star-otto

や Arduino PRIMO が出そうです。
A000111-Arduino-Primo-1front.jpg
http://www.arduino.org/products/boards/arduino-primo
いずれも WiFiや BLE を搭載しているので、IoT にはもってこいなのですが日本国内では例によって技適(無線の許可)が必須となるので時間がかかりそう。

2つのIDEをどのように共存させるか?
それぞれのダウンロード元からIDEファイルをダウンロードしますが、zip形式のファイルがありますので、それをダウンロードしてそれぞれ別のフォルダーに展開し中のArduino.exe がありますのでクリックして起動すれば個別に起動します。
Arduino.cc の場合
cc_Download.jpg

Arduino.org
org_DownLoad.jpg

国内では LAPIS 社より Lazurite Sub-GHz ( これは 920MHz で無線通信が可能)あります。さすが国産なので既に販売が開始されている。(でも、どこと通信するのとツッコまないで!)
Lazurite-Sub-GHz-640x428.jpg
http://www.lapis-semi.com/lazurite-jp/products/lazurite-sub-ghz

ほかに老舗のTI社が出している。MSP432(ARM 32bit) や MSP430(16bit) と言った Arduino 類似品もでています。
LaunchPadシリーズ IDE は Energia (ボードは国内でも購入可能です。)
http://www.tij.co.jp/ww/launchpad/launchpad.html


posted by white at 12:03| Comment(0) | 日記 | このブログの読者になる | 更新情報をチェックする

2016年08月22日

温度、湿度 測定+Ethernet

Ethernet (UDP) 経由で"ON" コマンドを送り、Arduino は温度と湿度を測定し結果をPC 送信します。
Ether_AM2321_2.jpg

AM2321 温湿度センサーの組込み
Arduino UNO の上に Ethernet シールドを載せています。

無題.png

以下にプログラムを晒します。(ダウンロードも可能です。)
UDP 通信部はサンプルにある UDPSendReceiveString を参照しました。
AM2321 より温度、湿度を読み込むのは I2C 通信により読み込みます。
本来は CRC 計算してデータに化けが無いこと確認するのですが、今回は省略しています。
( GitHab にはあったような? )



01: /*
02: UDPSendReceiveString:
03: This sketch receives UDP message strings, prints them to the serial port
04: and sends an "acknowledge" string back to the sender
05:
06: A Processing sketch is included at the end of file that can be used to send
07: and received messages for testing with a computer.
08:
09: created 21 Aug 2010
10: by Michael Margolis
11:
12: This code is in the public domain.
13: */
14: /*
15: Edit by kawabe 2016/08/22
16: */
17:
18: #include <SPI.h> // needed for Arduino versions later than 0018
19: #include <Ethernet.h>
20: #include <EthernetUdp.h> // UDP library from: bjoern@cs.stanford.edu 12/30/2008
21: // インストールしたフォルダーの配下にあります。
22: // \arduino-1.6.10\libraries\Ethernet\src\EthernetUdp.h
23: #include <Wire.h>
24:
25: #include <string.h> // for strcmp
26:
27: typedef struct {
28: int HumidityH ; // 湿度 整数
29: int HumidityL; // 湿度 小数点以下
30: int TemperatureH; // 温度 整数
31: int TemperatureL; // 温度 小数点以下
32: } HumidityTemperature_t ;
33:
34: void GetTempHumidi(HumidityTemperature_t ht) ;
35:
36: #define GREEN_LED_PIN 8
37: byte I2C_AM2321 = 0x5c ; // AM2321 I2C Slave address
38: byte I2C_data[8]; // AM2321 受信データエリア
39:
40: // Enter a MAC address and IP address for your controller below.
41: // The IP address will be dependent on your local network:
42: byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x51, 0xEB };
43: // Ethernet シールド基板の裏側にシールが貼ってあります。
44: IPAddress ip(192, 168, 100, 32);
45:
46: unsigned int localPort = 45600; // local port to listen on
47:
48: // buffers for receiving and sending data
49: #define SEND_UDP_BUFFER_MAX 16
50: char packetBuffer[UDP_TX_PACKET_MAX_SIZE]; //buffer to hold incoming packet,
51: char ReplyBuffer[SEND_UDP_BUFFER_MAX] ; // a string to send back
52: String strBuffer ;
53:
54: // An EthernetUDP instance to let us send and receive packets over UDP
55: EthernetUDP Udp;
56:
57: //------------------------------------------------------------
58: // Setup
59: //------------------------------------------------------------
60: // 1.PIN 割り当て
61: // 2.Ethernet の準備
62: // 3.UDP 通信の開始
63: // 4.シリアル通信の開始 ( for Debug )
64: void setup() {
65: pinMode(GREEN_LED_PIN, OUTPUT);
66:
67: Wire.begin(); // I2C 準備
68:
69: // start the Ethernet and UDP:
70: Ethernet.begin(mac, ip);
71: Udp.begin(localPort);
72:
73: Serial.begin(9600);
74: }
75:
76: //------------------------------------------------------------
77: // Main Loop
78: //------------------------------------------------------------
79: // 1.UDP によりコマンド(ON)受信
80: // 2.温湿度読み込み指示
81: // 3.UDP で温度、湿度データを送信する。
82: void loop() {
83: int i ;
84: HumidityTemperature_t ht ;
85: String strHumidityH ;
86: String strHumidityL;
87: String strTemperatureH;
88: String strTemperatureL;
89:
90: // if there's data available, read a packet
91: int packetSize = Udp.parsePacket();
92: if (packetSize > 0) {
93: Serial.println("-------");
94: Serial.print("Received packet of size ");
95: Serial.println(packetSize);
96: Serial.print("From ");
97: IPAddress remote = Udp.remoteIP();
98: for (int i = 0; i < 4; i++) {
99: Serial.print(remote[i], DEC);
100: if (i < 3) {
101: Serial.print(".");
102: }
103: }
104: Serial.print(", port ");
105: Serial.println(Udp.remotePort());
106:
107: // read the packet into packetBufffer
108: Udp.read(packetBuffer, UDP_TX_PACKET_MAX_SIZE);
109: Serial.print("Contents:");
110: Serial.println(packetBuffer);
111: if ( strcmp( packetBuffer, "ON" ) == 0 ) { // "ON" を受信した。
112: digitalWrite(GREEN_LED_PIN, HIGH); // Green LED ON ;
113: GetTempHumidi(&ht) ; // 温湿度データ取得
114: // 温湿度データを文字列に変更
115: strHumidityH = String( ht.HumidityH ) ;
116: strHumidityL = String( ht.HumidityL ) ;
117: strTemperatureH = String( ht.TemperatureH ) ;
118: strTemperatureL = String( ht.TemperatureL ) ;
119: strBuffer = "H=" + strHumidityH ;
120: strBuffer += "." ;
121: strBuffer += strHumidityL ;
122: strBuffer += " T=" ;
123: strBuffer += strTemperatureH ;
124: strBuffer += "." ;
125: strBuffer += strTemperatureL ;
126: // strBuffer ==> ReplyBuffer コピー
127: ReplyBuffer[0] = 0 ;
128: strBuffer.getBytes( ReplyBuffer, SEND_UDP_BUFFER_MAX) ;
129: // 温湿度データを UDP により送信する。
130: Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
131: Udp.write(ReplyBuffer);
132: Udp.endPacket();
133: delay(200) ; // LED 点灯確認用
134: digitalWrite(GREEN_LED_PIN, LOW); // Green LED OFF ;
135: }
136: // Clear Buffer
137: if ( packetSize >= UDP_TX_PACKET_MAX_SIZE ) {
138: packetSize = UDP_TX_PACKET_MAX_SIZE - 1 ; // 念のため
139: }
140: for ( i = 0 ; i <= packetSize ; i ++ ) {
141: packetBuffer[i] = 0 ;
142: }
143: }
144: delay(10);
145: }
146:
147: //------------------------------------------------------------
148: // AM2321 より温度、湿度の読み込む
149: //------------------------------------------------------------
150: void GetTempHumidi(HumidityTemperature_t* ht)
151: {
152: int i ;
153: int Humidity16 ;
154: int Temperature16 ;
155:
156: // AM2321 アクセス
157: Wire.beginTransmission(I2C_AM2321);
158: Wire.write(0x00);
159: Wire.endTransmission();
160: delay(1) ;
161:
162: Wire.beginTransmission(I2C_AM2321);
163: Wire.write(0x03); // Function read register
164: Wire.write(0x00); // 0 (Top register)
165: Wire.write(0x04); // Read 4 byte
166: Wire.endTransmission();
167: delay(2) ;
168: Wire.requestFrom(I2C_AM2321, 0x08);
169: // 湿度、温度データ取得
170: i = 0;
171: while (Wire.available()) {
172: I2C_data[i++] = Wire.read();
173: }
174:
175: // Humidity 100.0% ==> 0x03E8
176: Humidity16 = (I2C_data[2] << 8) + I2C_data[3];
177: ht->HumidityH = Humidity16 / 10;
178: Serial.print("Humidity=");
179: Serial.print(ht->HumidityH); // 10進で小数点より上を表示
180: Serial.print(".");
181: ht->HumidityL = Humidity16 % 10; // 10 で除算した余り
182: Serial.print(ht->HumidityL); // 10進で小数点以下を表示
183: Serial.println("%");
184:
185: // Temperature
186: // I2C_data[4] = 0xFF ; // minus test FF83 ==> -125, FFF5 ==> -11
187: // I2C_data[5] = 0xF5 ; // minus test FF75 ==> -139
188: Temperature16 = (I2C_data[4] << 8) + I2C_data[5] ;
189: ht->TemperatureH = Temperature16 / 10;
190: Serial.print("Temperature=");
191: Serial.print(ht->TemperatureH );
192: Serial.print(".");
193: ht->TemperatureL = abs(Temperature16 % 10); // 小数点以下に符号を付けない
194: Serial.print(ht->TemperatureL);
195: Serial.println(" C");
196: }



ソースをアップします。
UDP_2_20160822.zip

反対側からの写真です。
Ether_AM2321_3.jpg

PC側は前回と同じ UDP_Connect です。(Windows で動きます。)

Uno_Ether_AM2321_PC01.jpg

@:自身のIPアドレスを設定します。
A:Arduino 側のIPアドレスを設定します。
B:今回使用するポート番号を設定します。
C:Close となっているボタンをクリックし Open させます。
D:コマンド "ON" を登録します。
E:Send ボタンを押し"ON"を送信します。
  結果は右窓に表示されます。
8:送信間隔を 5000msec(5秒)程度に設定します。
7:Repeat にチェックを入れると5秒間隔で"ON"を送信します。

PC(Windows)のソースです。(C++Builder XE5 でつくりました。)
UDP_Test_VCL_020.zip





 
posted by white at 11:39| Comment(0) | 日記 | このブログの読者になる | 更新情報をチェックする

2016年08月18日

Ethernet 接続

 Arduino に Ethernet シールドを追加してネットワークに接続します。(社内のローカルネットワークに接続)
今回はArduino Mega(基板が長いやつ) の上にEthernet シールドを2階建てみたいに接続します。
 接続は UDP で行います。PC から"ON"電文をArduinoに投げる。受信するとLED を点灯し、"OFF"を受信するとLEDを消灯します。
 Arduino 側のプログラムは スケッチの例 → Ethernet → UDPSendReceiveString を参考にします。

Mega_Ether.jpg


/*
UDPSendReceiveString:
This sketch receives UDP message strings, prints them to the serial port
and sends an "acknowledge" string back to the sender

A Processing sketch is included at the end of file that can be used to send
and received messages for testing with a computer.

created 21 Aug 2010
by Michael Margolis

This code is in the public domain.
*/
/*
* Edit by kawabe 2016/08/18
*/

#include <SPI.h> // needed for Arduino versions later than 0018
#include <Ethernet.h>
#include <EthernetUdp.h> // UDP library from: bjoern@cs.stanford.edu 12/30/2008
// インストールしたフォルダーの配下にあります。
// \arduino-1.6.10\libraries\Ethernet\src\EthernetUdp.h

#include <string.h> // for strcmp

#define GREEN_LED_PIN 12

// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x51, 0xEB };
// Ethernet シールド基板の裏側にシールが貼ってあります。
IPAddress ip(192, 168, 100, 32);

unsigned int localPort = 45600; // local port to listen on

// buffers for receiving and sending data
char packetBuffer[UDP_TX_PACKET_MAX_SIZE]; //buffer to hold incoming packet,
char ReplyBuffer[] = "acknowledged"; // a string to send back

// An EthernetUDP instance to let us send and receive packets over UDP
EthernetUDP Udp;

void setup() {
pinMode(GREEN_LED_PIN, OUTPUT);

// start the Ethernet and UDP:
Ethernet.begin(mac, ip);
Udp.begin(localPort);

Serial.begin(9600);
}

void loop() {
int i ;
// if there's data available, read a packet
int packetSize = Udp.parsePacket();
if (packetSize) {
Serial.print("Received packet of size ");
Serial.println(packetSize);
Serial.print("From ");
IPAddress remote = Udp.remoteIP();
for (int i = 0; i < 4; i++) {
Serial.print(remote[i], DEC);
if (i < 3) {
Serial.print(".");
}
}
Serial.print(", port ");
Serial.println(Udp.remotePort());

// read the packet into packetBufffer
Udp.read(packetBuffer, UDP_TX_PACKET_MAX_SIZE);
Serial.println("Contents:");
Serial.println(packetBuffer);
if ( strcmp( packetBuffer, "ON" ) == 0 ) {
digitalWrite(GREEN_LED_PIN, HIGH); // turn the LED on (HIGH is the voltage level) ;
}
if ( strcmp( packetBuffer, "OFF" ) == 0 ) {
digitalWrite(GREEN_LED_PIN, LOW); // turn the LED on (HIGH is the voltage level) ;
}
// Clear Buffer
if ( packetSize >= UDP_TX_PACKET_MAX_SIZE ) {
packetSize = UDP_TX_PACKET_MAX_SIZE - 1 ; // 念のため
}
for ( i = 0 ; i <= packetSize ; i ++ ) {
packetBuffer[i] = 0 ;
}

// send a reply to the IP address and port that sent us the packet we received
Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
Udp.write(ReplyBuffer);
Udp.endPacket();
}
delay(10);
}

Mega_Ether_PC.jpg

図では分かり難いので写真を載せておきます。

Arduino_Ether.jpg

PCソースファイル(C++Builder XE5 で作りました。)
UDP_Test_VCL_020.zip
posted by white at 12:57| Comment(0) | 日記 | このブログの読者になる | 更新情報をチェックする

2016年08月16日

ウエアブル向け

ウエラブル向けには LilyPad がありますが、こんなのも Arduino 互換機にあります。ボタン電池の大きさから推測するとかなり小さそうです。
SquareWear2.jpg

英語ですが動画があります。



既に国内で販売されている様子。(技適をとる必要がないからか!)
posted by white at 12:01| Comment(0) | 日記 | このブログの読者になる | 更新情報をチェックする

2016年08月15日

外部の LED を点滅させる。

 Arduino にブレッドボートを接続しそこに LED(緑) と抵抗(200Ω)を配置して Arduino からの指示で LED を点滅させます。
LED_Brink_11.jpg

スケッチを作ります。
前回と異なるは 13番ピンを使用せず、12番ピンを使用しています。
void setup() {
// initialize digital pin 13 as an output.
pinMode(12, OUTPUT);
}

// the loop function runs over and over again forever
void loop() {
digitalWrite(12, HIGH); // turn the LED on (HIGH is the voltage level)
delay(150); // wait for a second
digitalWrite(12, LOW); // turn the LED off by making the voltage LOW
delay(500); // wait for a second
}

実物の写真です。
LED_Brink_12.jpg

実は実物の写真には200Ωの抵抗を使っています。しかし回路の絵では220Ωとなっています。電気に詳しい人からは200Ωの抵抗て売っているんだと感心されることがありますが、最近は部品屋さんでも簡単に手に入ります。(詳しくは "E12系列の抵抗" でググって下さい。)
posted by white at 22:47| Comment(0) | 日記 | このブログの読者になる | 更新情報をチェックする
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。