2016年10月14日

照度センサー(TSL2561)

ライブラリーを使いましょう
 ライブラリーを使えばハード周りのアクセスがかなり楽になります。I2C へのアクセスは <Wire.h> にお願いして、照度センサー関連のデータ変換は <Adafruit_TSL2561_U.h> と <Adafruit_Sensor.h> に任せて楽しましょう。

 ネットの写真では6ピンのハズでしたが実物は7ピン?あれ、どうなっているのかと見るとPDFの説明書をみると画像はやはり2つ、しかし回路図をみると7ピン。少々混乱したけど7ピンで作業を始める。
HomePage.jpg

以下の通り配線して下さい。
Ar&T2561.jpg

今回はライブラリを使用します。https://learn.adafruit.com/tsl2561 メーカーのホームページにライブラリがありますのでダウンロードしてください。左の Using the TSL2561 sensor をクリックするとライブラリのダウンロード画面になります。赤枠の2つともダウンロードしてください。

DownLoad2.jpg

ダウンロードしたファイルを解凍して \arduino-1.6.12\libraris の下に配置します。
Lib.jpg

Adafruit_TSL2561-master の下に examples フォルダーがありその中に sensorapi があります。適当なフォルダーにコピーして使用します。Arduino ではスケッチの拡張子は .ino ですが、フォルダーが作られその下にスケッチの本体ファイルが作成されます。なお、フォルダー名とスケッチ名は同じです。

サンプル
sample_TSL2561.jpg

シリアルモニターを表示してマイコンボードに書き込むと直ちに実行され測定結果が表示されます。
(最近のシリアルモニターは事前に起動できます。ターゲット起動時にクリアーされることはありません。)
TSL2561Test.jpg
posted by white at 12:42| Comment(0) | 日記 | このブログの読者になる | 更新情報をチェックする

2016年10月08日

Web Server

Arduino の 本家、元祖 争いは和解したようです。
http://www.itmedia.co.jp/news/articles/1610/03/news055.html

 Ethernet に接続します。以前、UDP 接続しましたが、今回は TCP で行います。Arduino にEthernet シールドを追加し、ウエブサーバーとします。
 ウエブサーバと言っても Apache や nginx のようなものではありません。Perl や Ruby は間違っても動きません。C 言語で作ります。
 まずはArduino に温湿度センサーを付け、それをネットに公開します。定期的に温湿度センサーよりデータを取得して呼び出されたブラウザに結果を送ります。温湿度センサーはAM2321を使用しますが、多分、これが最後です。(ディスコンのため)
ウエブサーバーもサンプルスケッチがありそれを元に機能を追加します。

WebSrever.jpg


サンプルにAM2321よりデータを読み込むルーチンを追加して定期的に温度、湿度を送信します。表示は HTML に準拠して文字列を作りそれを TCP で送信します。サーバーはMACアドレスとIPアドレスをセットし、Web で使用するポート(80)を指定して

server.begin();

とすれば稼働を開始します。日本語表示は Web Browser 側でエンコードを UTF-8 に設定してください。
Temp&Humi.jpg
Uno_Ether_AM2321_01.jpg
Ether_AM2321_3.jpg

01: /*
02: Web Server
03:
04: A simple web server that shows the value of the analog input pins.
05: using an Arduino Wiznet Ethernet shield.
06:
07: Circuit:
08: * Ethernet shield attached to pins 10, 11, 12, 13
09: * Analog inputs attached to pins A0 through A5 (optional)
10:
11: created 18 Dec 2009
12: by David A. Mellis
13: modified 9 Apr 2012
14: by Tom Igoe
15: modified 02 Sept 2015
16: by Arturo Guadalupi
17:
18: */
19:
20: #include <SPI.h>
21: #include <Ethernet.h>
22: #include <string.h> // for strcmp
23: #include <Wire.h>
24:
25: typedef struct {
26: int HumidityH ; // 湿度 整数
27: int HumidityL; // 湿度 小数点以下
28: int TemperatureH; // 温度 整数
29: int TemperatureL; // 温度 小数点以下
30: } HumidityTemperature_t ;
31:
32: byte I2C_AM2321 = 0x5c ; // AM2321 I2C Slave address
33: byte I2C_data[8]; // AM2321 受信データエリア
34:
35: // Enter a MAC address and IP address for your controller below.
36: // The IP address will be dependent on your local network:
37: byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x51, 0xEB }; // 1.MAC Address
38: IPAddress ip(192, 168, 100, 77); // 2.IP Address
39:
40: // Initialize the Ethernet server library
41: // with the IP address and port you want to use
42: // (port 80 is default for HTTP):
43: EthernetServer server(80); // 3.Port 指定
44:
45: void GetTempHumidi(HumidityTemperature_t* ht) ;
46:
47: void setup() {
48: // Open serial communications and wait for port to open:
49: Serial.begin(9600);
50: while (!Serial) {
51: ; // wait for serial port to connect. Needed for native USB port only
52: }
53: Wire.begin(); // I2C 準備
54:
55: // start the Ethernet connection and the server:
56: Ethernet.begin(mac, ip); // 4.Ethernet 開始
57: server.begin(); // 5.サーバー開始
58: Serial.print("server is at ");
59: Serial.println(Ethernet.localIP());
60: }
61:
62:
63: void loop() {
64: // listen for incoming clients
65: EthernetClient client = server.available();
66: HumidityTemperature_t ht ;
67: String strHumidityH ;
68: String strHumidityL;
69: String strTemperatureH;
70: String strTemperatureL;
71: String strBuffer ;
72:
73: if (client) {
74: Serial.println("new client");
75: // an http request ends with a blank line
76: boolean currentLineIsBlank = true;
77: while (client.connected()) { // 接続要求があったか?
78: if (client.available()) {
79: char c = client.read();
80: Serial.write(c);
81: // if you've gotten to the end of the line (received a newline
82: // character) and the line is blank, the http request has ended,
83: // so you can send a reply
84: if (c == '\n' && currentLineIsBlank) {
85: // send a standard http response header
86: client.println("HTTP/1.1 200 OK");
87: client.println("Content-Type: text/html");
88: client.println("Connection: close"); // the connection will be closed after completion of the response
89: client.println("Refresh: 5"); // refresh the page automatically every 5 sec
90: client.println();
91: client.println("<!DOCTYPE HTML>");
92: client.println("<html>");
93: client.println("<head>");
94: client.println("<title>Temperature & Humidity</title>");
95: client.println("</head>");
96:
97: GetTempHumidi(&ht) ; // 温湿度データ取得
98: strHumidityH = String( ht.HumidityH ) ;
99: strHumidityL = String( ht.HumidityL ) ;
100: strTemperatureH = String( ht.TemperatureH ) ;
101: strTemperatureL = String( ht.TemperatureL ) ;
102:
103: // 日本語表示は UTF-8
104: strBuffer = "温度(Temperature)=" ;
105: strBuffer += strTemperatureH ;
106: strBuffer += "." ;
107: strBuffer += strTemperatureL ;
108: strBuffer += " 湿度(Humidity)=" + strHumidityH ;
109: strBuffer += "." ;
110: strBuffer += strHumidityL ;
111:
112: client.print(strBuffer);
113: client.println("<br />");
114:
115: client.println("</html>");
116: break;
117: }
118: if (c == '\n') {
119: // you're starting a new line
120: currentLineIsBlank = true;
121: } else if (c != '\r') {
122: // you've gotten a character on the current line
123: currentLineIsBlank = false;
124: }
125: }
126: }
127: // give the web browser time to receive the data
128: delay(2);
129: // close the connection:
130: client.stop();
131: Serial.println("client disconnected");
132: }
133: }
134: //------------------------------------------------------------
135: // AM2321 より温度、湿度の読み込む
136: //------------------------------------------------------------
137: void GetTempHumidi(HumidityTemperature_t* ht)
138: {
139: int i ;
140: int Humidity16 ;
141: int Temperature16 ;
142:
143: // AM2321 アクセス
144: Wire.beginTransmission(I2C_AM2321);
145: Wire.write(0x00);
146: Wire.endTransmission();
147: delay(1) ;
148:
149: Wire.beginTransmission(I2C_AM2321);
150: Wire.write(0x03); // Function read register
151: Wire.write(0x00); // 0 (Top register)
152: Wire.write(0x04); // Read 4 byte
153: Wire.endTransmission();
154: delay(2) ;
155: Wire.requestFrom(I2C_AM2321, 0x08);
156: // 湿度、温度データ取得
157: i = 0;
158: while (Wire.available()) {
159: I2C_data[i++] = Wire.read();
160: }
161: // Serial.println("-------");
162: // Serial.println(I2C_data[0],HEX) ; // 機能コード 0x03
163: // Serial.println(I2C_data[1],HEX) ; // データ数 0x04
164: // Humidity 100.0% ==> 0x03E8
165: Humidity16 = (I2C_data[2] << 8) + I2C_data[3];
166: ht->HumidityH = Humidity16 / 10;
167: Serial.print("Humidity=");
168: Serial.print(ht->HumidityH); // 10進で小数点より上を表示
169: Serial.print(".");
170: ht->HumidityL = Humidity16 % 10; // 10 で除算した余り
171: Serial.print(ht->HumidityL); // 10進で小数点以下を表示
172: Serial.println("%");
173:
174: // Temperature
175: // I2C_data[4] = 0xFF ; // minus test FF83 ==> -125, FFF5 ==> -11
176: // I2C_data[5] = 0xF5 ; // minus test FF75 ==> -139
177: Temperature16 = (I2C_data[4] << 8) + I2C_data[5] ;
178: ht->TemperatureH = Temperature16 / 10;
179: Serial.print("Temperature=");
180: Serial.print(ht->TemperatureH );
181: Serial.print(".");
182: ht->TemperatureL = abs(Temperature16 % 10); // 小数点以下に符号を付けない
183: Serial.print(ht->TemperatureL);
184: Serial.println(" C");
185: }
186:
posted by white at 23:57| Comment(0) | 日記 | このブログの読者になる | 更新情報をチェックする

2016年09月09日

Bootloader

Arduino 互換機のCPU にBootloader を書き込めば Arduino IDE からスケッチを書き込むことが出来ます。前回、JTAGICE3 でデバッグしているので Bootloader を書き込んでみます。肝心のBootloader はダウンロードしたArduino IDE の下にあります。Hex ファイルを選択します。
...\arduino-1.6.XX\hardware\arduino\avr\bootloaders\optiboot\optiboot_atmega328.hex
(XX にはバージョン番号の数字が入ります。ダウンロードしたバージョンに合わせてください。)

メニューよりツール → Device Programming で Memories を選択し、画面右端の[...] よりHEX ファイルを指定し、Program ボタンを押すと直ちに書き込みが行われます。
Hex.jpg

次に Fuses bit の値を
EXTENDED:0xFD,
HIGH : 0xD6,
LOW : 0xFF
にセットし、Program します。
FuseBit.jpg

さらに Lock bits の値を LOCKBIT:0xCF に設定して Program します。
LockBit.jpg

あとはジャンパーピンを設定して USB ケーブルを接続すると Arduino IDE からスケッチを書き込むことが出来ます。
Arduino IDE のツールよりシリアルポートを設定する必要があります。前回接続した Arduino UNO とは ドライバーが異なるためです。
Write_Boot.jpg
posted by white at 18:07| Comment(0) | 日記 | このブログの読者になる | 更新情報をチェックする

2016年09月06日

AVR のデバッグ

aki_s.jpg

折角、JTAG を接続しているのでデバッグして見たいと思います。
プログラムの任意の場所で停止が可能となります。
まず、Fuse 設定でデバッグを可能とします。
(フューズを書き込みます。一旦、書き込むと ツール → Device Programming ではアクセスできなくなります。別の方法で Fuse を変更します。)
At7_11.jpg

次に、メニューのプロジェクト→GccApplication1のプロパティ(Alt+F7)にて接続しているデバッガーとインターフェイスを指定します。
At7_12.jpg

メニューの Start Debugging and Break (Alt+F5) を選択すると main の最初で停止します。
At7_13.jpg

あとは停止したいところに Break Point をセットすることが出来ます。(行の左端をダブルクリックすれば赤マークが設定される。)
例えば、タイマー割り込み内で停止させ、その時の変数値をチェックします。
At7_TimerDebug.jpg

なお、デバッグが終了した時は Disable debugWIRE and Close を選択します。Fuse を読み込むと DWEN のチェックが消えています。
At7_16.jpg

デバッグ開始時に Cycle Powerのメッセージがでるタイミングがあります。画面の指示に従って、CPUの電源を ON → OFF → ON した後、Start Debugging and Break (Alt+F5)すれば開始されます。
CyclePower.jpg

Fuse を読めないタイミングがありますが、デバッグ → Attach to Target をクリックすると読めることがあります。

なお、Fuseにアクセスする場合、Auto read のチェックは外しておくと混乱しなくてすみます。チェックがあると画面を変更した時に常に状態を更新しようと読み込みますので、あれ!
さっき変更したのにと思うことがあります(チェックマークだけで Program していないともとの状態に戻ってしまいます。)

よく見ると、main.c ファイルの名前が異なっている。確か、Atmel Studio Version 6 ではこのように main.c では無く、GccAplicationX.c となっていた。(X には 1〜の数字が入る)
At7_4_1.jpg
posted by white at 11:33| Comment(0) | 日記 | このブログの読者になる | 更新情報をチェックする

2016年09月05日

Atmel Studio 7

今回はArduino IDE 以外で ATmega328 にプログラムを書き込んでみます。基板はArduinoと互換の基板(基板のみ150円)が秋月電子より販売されています。この基板にCPU や周辺部品(キットが販売されています)を半田付けしてArduino 互換機を作ります。
K-04590.jpg
CPU はATmega328Pを使用します。通常のCPUのためこのままではArduino IDEを接続してもプログラムは書き込めません。Arduino IDEでプログラムを書き込むにはCPU に Bootloader が事前に書き込まれている必要があります。
詳しくは https://synapse.kyoto/tips/bootloader/page001.html を参考にしてください。

プログラムの作成、書き込みにAtmel Studio 7とJTAGICE3(現在はATMEL-ICE-BASICにアップグレードしている。)
Atmel-ICE_angle.jpg

を使用します。
 Atmel Studio 7 はAteml のホームページ http://www.atmel.com/ja/jp/tools/ATMELSTUDIO.aspx へ行きユーザー登録すると、Atmel Software Download のメールが来ますので指示に従って登録すればダウンロードできます。
 ダウンロードする場合は「Atmel Studio 7.0 (build 1006) offline installer」をお勧めします、ファイルサイズは大きいですが、一旦ダウンロードするとネット接続なしでインストール可能です。
 ダウンロード後は。as-installer-7.0.1006-full.exeをクリックするとインストールが始まります。あとはNext(またはInstall)をクリックするだけでインストール可能です。USB ドライバーもインストールされます。

プログラムの開始
Atmel Studio 7の起動
(マイクロソフト社のVisual Studio をベースにコンパイラが Atmel 用のGCC となっています。8bit, 32bit用のCPU に対応)New project... を選択し、新規作成を行います。
At7_1.jpg

GCC C 実行用を選択し保存するフォルダーを指定します。
At7_2.jpg

CPU を選択します。
At7_3.jpg

暫くすると雛形が作成されます。これに新たにプログラムを追加していきます。
At7_4.jpg

標準では行番号が表示されていないので行番号を表示させます。
メニューよりツール → オプション テキストエディター → テキスト形式 行番号にチェックを入れます。
At7_5.jpg

main.h ファイルを追加する場合はソリューションエクスプローラーのプロジェクト名を右クリックし
追加→新しい項目 を選択し、
At7_6.jpg

ファイル種別とファイル名を指定します。
At7_7.jpg

タイマー割り込みを使用するため
同様にTimer0.c Timer0.h を追加していきます。

プログラムをCPUに書き込みます。
ツール → Device Programming で書き込み画面を表示させ[Apply] ボタンをクリックします。
memories タブで書き込むプログラムを確認して書き込[Program]ボタンをクリックすると書き込みが開始されます。
At7_ProgWrite.jpg

書き込み後、すぐにプログラムが走ます。(でも、LED の点滅間隔がやけに長く感じます。

Fuse 設定を確認すると
At7_FirstFuse.jpg

CKDIV8 にチェックマークがついており。この為クロックが1/8 になっています。チェックを外して再度書き込みます。
At7_2ndFuse.jpg

これでプログラムの作成から書き込みまでがおわりました。
ソースを置いておきます。Atmel_LED_20160905.zip

次回はデバッグ方法を書いてみます。
posted by white at 17:25| Comment(0) | 日記 | このブログの読者になる | 更新情報をチェックする
×

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