マイコンとは全く関係ないですが、3DプリンタでHDD/SSD用の2.5インチ→3.5インチのマウンタを作ってみました。
作成に使った3D-CADは、無料のDesignSpark Mecanical。

STLファイルで保存して3Dプリンタで印刷。待つこと1時間30分…。

完成しました!


参考に、実際に印刷したSTLファイルをアップロードしておきます。
3Dプリンタ
PICマイコンとかESP-WROOM-02とかつかったIoT的な電子工作について
ESP8266HTTPClientを使ってあげれば
httpであればProxy経由で取得するのは簡単でした。
httpsは一筋縄ではいかなそう(?)勉強中です。
単純なサンプルを載せておきます。
/* * 単純にProxy経由でWEBページを取得するサンプル */ #include <ESP8266WiFi.h> #include <ESP8266HTTPClient.h> void setup() { Serial.begin(115200); Serial.println(); WiFi.mode(WIFI_STA); WiFi.begin("SSID", "PASSWORD"); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(); Serial.println("WiFi connected"); Serial.print("IP address: "); Serial.println(WiFi.localIP()); } void loop() { // wait for WiFi connection if((WiFi.status() == WL_CONNECTED)) { HTTPClient http; Serial.print("[HTTP] begin...\n"); //Proxyサーバを使う場合 http.begin("Proxy.server.ip",8080,"http://www.dmsk.com/pc/main-hw.html"); //Proxyサーバを使わない場合 //http.begin("http://www.dmsk.com/pc/main-hw.html"); Serial.print("[HTTP] GET...\n"); // start connection and send HTTP header int httpCode = http.GET(); // httpCode will be negative on error if(httpCode > 0) { // HTTP header has been send and Server response header has been handled Serial.printf("[HTTP] GET... code: %d\n", httpCode); // file found at server if(httpCode == HTTP_CODE_OK) { String payload = http.getString(); Serial.println(payload); } } else { Serial.printf("[HTTP] GET... failed, error: %s\n", http.errorToString(httpCode).c_str()); } http.end(); } delay(20000); }
解説というほどのこともないですが、
35行目で、Proxyサーバのアドレス、ポート、開きたいページのURLを指定するだけです。
Yahoo天気予報をESP8266-WROOM-02やESP–32などのマイコンから参照しやすくしてみる
天気予報はYahooやLivedoorが無料でRSSを提供してくれています。他にもgooとかもやってみたいです。今回はYahoo!の天気予報をマイコンで表示したりするのに利用しやすくするためにごにょごにょしたことをまとめておきたいと思います。
まず、Yahooの天気予報のRSSは、次のページで各地域ごとにxml形式で提供されています。
https://weather.yahoo.co.jp/weather/rss/
実際に開いてみるとわかりますが、更新日時とか、警報や注意報など天気以外の表示するのに必要なさそうな情報も沢山入っています。この大量の文字列からパターンマッチをして必要な文字列を切り出して来なければなりません。なんて考えていたらマイコンでこの処理をさせるのは大変だーと思ってきました。さらに、Yahooの天気予報はhttpsなのでセキュア通信もさせなくてはなりません…。うーん、httpsだとプロキシ経由だったりするとページを取得するだけでも難しそうだな、、、などなど色々考えた結果。扱いやすいデータに変換してからマイコンで受信したほうが簡単じゃないか(?)というとこに至ったのでした。
前置きが長くなりましたが、今回やってみるのは、PHPを使ってマイコンで使いやすい天気予報データに変換しちゃおう♪というのが狙いです。
概要:
・Yahooの天気予報のRSSを利用
・WEBサーバ上で動くPHPプログラムを作成してみる
(PHPにした理由はPHPだと簡単だから)
■getytenki.phpのプログラム
<?php header('Content-type: application/xml; charset=UTF-8'); date_default_timezone_set('Asia/Tokyo'); //リクエストURLから数字文字列を取得 $placeNo = htmlspecialchars($_GET["p"]); //Yahoo天気のxmlファイルのURL $xmlurl = "https://rss-weather.yahoo.co.jp/rss/days/" . $placeNo . ".xml"; //xml読み込む $lines = file($xmlurl); echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"; echo "<root>\n"; echo "<sourceurl>" . $xmlurl . "</sourceurl>\n"; echo "<dataprovider>Yahoo!天気・災害</dataprovider>\n"; foreach ($lines as $line_num => $line) { //copyright表示 if(preg_match('/<copyright(.+)copyright>/',$line,$matches)){ echo $matches[0] . "\n"; echo "<today>" . date('Y年m月d日') . "</today>\n"; } //<title>タグの情報を読み込む if(preg_match_all('/<title>(.+?)<\/title>/',$line,$matches)){ //print_r($matches); //場所の文字列を抜き出す if(preg_match('/災害 - (.+)の天気/',$matches[1][0],$place)){ echo "<place>" . mb_convert_kana($place[1],'a','UTF-8') . "</place>\n"; //全角→半角にもしておく } //天気情報を抜き出す foreach ($matches[1] as $mt_num => $mt) { if(preg_match_all('/【 (.+日.+?)).+ 】 (.+) - (.+) - /',$mt,$dt)){ //print_r($dt); echo "<item>"; echo mb_convert_kana($dt[1][0],'a','UTF-8') . ":" . $dt[2][0] . ":" . $dt[3][0]; echo "</item>\n"; } } } } echo "</root>\n";
プログラムはたったこれだけです。
上記プログラムをPHPが動くWEBサーバに置いてアクセスしてみます。ゆくゆくはマイコンでアクセスさせますが、まずはパソコンで確認です。
http://bmicom.dmsk.com/php/getytenki.php?p=4820
URLのおしりの数字は、Yahooの天気予報のxmlファイル名の数字です。ブラウザによっては文字が羅列されているかもしれませんが、ソースを見てもらうとxml形式になっているのがわかります。
今回は4820なので長野県松本の天気情報が取得できました。
出力されるxmlの文字コードはUTF-8になっています。
もしかしたらフォントの関係とかでShift-JISで受信したい場合もあるかもしれません。そんなときは以下のようにして、PHP側でShift-JISにしてしまうのも手かと思います。
■getytenkisj.phpのプログラム
<?php header('Content-type: application/xml; charset=Shift_JIS'); date_default_timezone_set('Asia/Tokyo'); //リクエストURLから数字文字列を取得 $placeNo = htmlspecialchars($_GET["p"]); //Yahoo天気のxmlファイルのURL $xmlurl = "https://rss-weather.yahoo.co.jp/rss/days/" . $placeNo . ".xml"; //xml読み込む $lines = file($xmlurl); echo mb_convert_encoding("<?xml version=\"1.0\" encoding=\"Shift-JIS\"?>\n", "SJIS", "UTF-8"); echo mb_convert_encoding("<root>\n", "SJIS", "UTF-8"); echo mb_convert_encoding("<sourceurl>" . $xmlurl . "</sourceurl>\n", "SJIS", "UTF-8"); echo mb_convert_encoding("<dataprovider>Yahoo!天気・災害</dataprovider>\n", "SJIS", "UTF-8"); foreach ($lines as $line_num => $line) { //copyright表示 if(preg_match('/<copyright(.+)copyright>/',$line,$matches)){ echo mb_convert_encoding($matches[0] . "\n", "SJIS", "UTF-8"); echo mb_convert_encoding("<today>" . date('Y年m月d日') . "</today>\n", "SJIS", "UTF-8"); } //<title>タグの情報を読み込む if(preg_match_all('/<title>(.+?)<\/title>/',$line,$matches)){ //print_r($matches); //場所の文字列を抜き出す if(preg_match('/災害 - (.+)の天気/',$matches[1][0],$place)){ echo mb_convert_encoding("<place>" . mb_convert_kana($place[1],'a','UTF-8') . "</place>\n", "SJIS", "UTF-8"); //全角→半角にもしておく } //天気情報を抜き出す foreach ($matches[1] as $mt_num => $mt) { if(preg_match_all('/【 (.+日.+?)).+ 】 (.+) - (.+) - /',$mt,$dt)){ //print_r($dt); echo mb_convert_encoding("<item>", "SJIS", "UTF-8"); echo mb_convert_encoding(mb_convert_kana($dt[1][0],'a','UTF-8') . ":" . $dt[2][0] . ":" . $dt[3][0], "SJIS", "UTF-8"); echo mb_convert_encoding("</item>\n", "SJIS", "UTF-8"); } } } } echo "</root>\n";
ESP-WROOM-02を2個使って片方がサーバ、もう片方がクライアントとして接続し、TCPソケット通信をしてみます。
UDPのサンプルは良く見るけど、TCPのソケット通信はなかなか見つからなかったので実験をかねて作成してみました。
クライアント側を電池で動かせばリモコンとして使えそうです。
概要:
・Arduinoの開発環境でプログラミングしてESP-WROOM-02に書込む
・サーバ側はSoftAPモードでWiFiアクセスポイントを開設
・クライアント側はSWを押すとコマンドをサーバに送る
・サーバ側は送られて来たコマンドを見てLEDをON/OFFする
動作イメージ
クライアント側のSWを押すとサーバ側のLEDが光ります
//サーバ側プログラム #include <ESP8266WiFi.h> static const char *SSID = "WROOM-B'MICOM"; static const char *PASSWD = "password"; const int LED1 = 12; //SW1のIOピン const int LED2 = 16; //SW2のIOピン const int LED3 = 5; //SW3のIOピン const int LED4 = 4; //SW4のIOピン IPAddress ip(192, 168, 0, 33); //IPAddress gateway(192, 168, 0, 1); //IPAddress netmask(255, 255, 255, 0); WiFiServer server(26842); //Port番号 void setup() { Serial.begin(115200); Serial.println(); pinMode(LED1, OUTPUT); pinMode(LED2, OUTPUT); pinMode(LED3, OUTPUT); pinMode(LED4, OUTPUT); //起動時LEDを光らせてみる digitalWrite(LED1, HIGH); delay(100); digitalWrite(LED1, LOW); digitalWrite(LED2, HIGH); delay(100); digitalWrite(LED2, LOW); digitalWrite(LED3, HIGH); delay(100); digitalWrite(LED3, LOW); digitalWrite(LED4, HIGH); delay(100); digitalWrite(LED4, LOW); //WiFiアクセスポイントを開始 WiFi.mode(WIFI_AP); WiFi.softAP(SSID, PASSWD); WiFi.softAPConfig(ip, WiFi.gatewayIP(), WiFi.subnetMask()); //WiFi.softAPConfig(ip, gateway, netmask); WiFi.begin(); IPAddress myIP = WiFi.softAPIP(); Serial.print("AP Started. myIP address: "); Serial.println(myIP); //Portのlistenを開始 server.begin(); Serial.println("Server started"); } void loop() { String cmd; cmd = rcvCommand(); //受信したコマンドに対応したLEDを点灯/消灯 if(cmd == "LED1OFF"){ Serial.print("Exec: "); Serial.println(cmd); digitalWrite(LED1, LOW); } if(cmd == "LED1ON"){ Serial.print("Exec: "); Serial.println(cmd); digitalWrite(LED1, HIGH); } if(cmd == "LED2OFF"){ Serial.print("Exec: "); Serial.println(cmd); digitalWrite(LED2, LOW); } if(cmd == "LED2ON"){ Serial.print("Exec: "); Serial.println(cmd); digitalWrite(LED2, HIGH); } if(cmd == "LED3OFF"){ Serial.print("Exec: "); Serial.println(cmd); digitalWrite(LED3, LOW); } if(cmd == "LED3ON"){ Serial.print("Exec: "); Serial.println(cmd); digitalWrite(LED3, HIGH); } if(cmd == "LED4OFF"){ Serial.print("Exec: "); Serial.println(cmd); digitalWrite(LED4, LOW); } if(cmd == "LED4ON"){ Serial.print("Exec: "); Serial.println(cmd); digitalWrite(LED4, HIGH); } } //コマンドを受信してそのコマンド文字列を返す String rcvCommand(){ WiFiClient client = server.available(); String rstr; if (client.connected()) { Serial.println("Connected to client"); //コマンド文字列受信(文字列が来なければタイムアウトする) rstr = client.readStringUntil('\r'); Serial.print("["); Serial.print(rstr); Serial.println("]"); //応答送信 client.print("OK\r"); //接続をクローズ client.stop(); Serial.println("Closed"); } return rstr; }
//クライアント側プログラム #include <ESP8266WiFi.h> #include <Ticker.h> #define SW_ONDELAY 4000 //SWチャタリング防止ディレイ(ループカウント数) #define SW_OFFDELAY 4000 //SWチャタリング防止ディレイ(ループカウント数) Ticker ticker1; //タイマ割り込み (LED点滅用) const char* ssid = "WROOM-B'MICOM"; const char* password = "password"; char hostIP[] = "192.168.0.33"; int hostPort = 26842; const int SW1 = 12; //SW1のIOピン const int SW2 = 16; //SW2のIOピン const int SW3 = 5; //SW3のIOピン const int SW4 = 4; //SW4のIOピン const int LED = 13; //LEDのIOピン int ledStatus = 0; //0:消灯 1:点灯 2:点滅 int sw1Status = 0; //0:OFF 1:ON int sw2Status = 0; //0:OFF 1:ON int sw3Status = 0; //0:OFF 1:ON int sw4Status = 0; //0:OFF 1:ON WiFiClient client; void setup() { Serial.begin(115200); //タイマ割り込み間隔と 割り込み関数名 LEDの点滅に使用 ticker1.attach_ms(500, ticker1_interrupt); pinMode(SW1, INPUT); pinMode(SW2, INPUT); pinMode(SW3, INPUT); pinMode(SW4, INPUT); pinMode(LED, OUTPUT); Serial.println("Booting..."); WiFi.mode(WIFI_STA); connectToWiFi(); } void connectToWiFi(){ ledStatus = 2;//0:消灯 1:点灯 2:点滅 WiFi.begin(ssid, password); delay(500); int retrycnt = 0; while(WiFi.waitForConnectResult() != WL_CONNECTED){ Serial.print("."); delay(100); retrycnt++; if(retrycnt > 100){ ESP.restart(); } } Serial.println("Connect Success"); } void loop() { if (WiFi.status() == WL_CONNECTED) { ledStatus = 1;//0:消灯 1:点灯 2:点滅 sw1process(); sw2process(); sw3process(); sw4process(); }else{ //WiFi接続が切れた Serial.println("WiFi ERR. Restart."); ESP.restart(); } } void sendSocket(String str) { if (client.connect(hostIP, hostPort)) { Serial.print("Connected:"); Serial.println(hostIP); Serial.println("Posting: " + str); //送信 client.print(str); //応答受信 client.setTimeout(1000); do{ String line = client.readStringUntil('\r'); Serial.print(line); } while (client.available() != 0); //残りがあるときはさらに受信のためループ Serial.println(); } else { Serial.println("Connection failed."); } } //SW1の処理 int sw1onCnt = 0; int sw1offCnt = 0; void sw1process(){ if(sw1Status == 0){ if(digitalRead(SW1) == HIGH){ sw1onCnt++; if(sw1onCnt == SW_ONDELAY){ //ON送信 sendSocket("LED1ON\r");; sw1Status = 1; sw1offCnt = 0; }else if(sw1onCnt > SW_ONDELAY){ sw1onCnt = SW_ONDELAY; } }else{ sw1onCnt = 0; } }else{ if(digitalRead(SW1) == LOW){ sw1offCnt++; if(sw1offCnt == SW_OFFDELAY){ //OFF送信 sendSocket("LED1OFF\r"); sw1Status = 0; sw1onCnt = 0; }else if(sw1offCnt > SW_OFFDELAY){ sw1offCnt = SW_OFFDELAY; } }else{ sw1offCnt = 0; } } } //SW2の処理 int sw2onCnt = 0; int sw2offCnt = 0; void sw2process(){ if(sw2Status == 0){ if(digitalRead(SW2) == HIGH){ sw2onCnt++; if(sw2onCnt == SW_ONDELAY){ //ON送信 sendSocket("LED2ON\r");; sw2Status = 1; sw2offCnt = 0; }else if(sw2onCnt > SW_ONDELAY){ sw2onCnt = SW_ONDELAY; } }else{ sw2onCnt = 0; } }else{ if(digitalRead(SW2) == LOW){ sw2offCnt++; if(sw2offCnt == SW_OFFDELAY){ //OFF送信 sendSocket("LED2OFF\r"); sw2Status = 0; sw2onCnt = 0; }else if(sw2offCnt > SW_OFFDELAY){ sw2offCnt = SW_OFFDELAY; } }else{ sw2offCnt = 0; } } } //SW3の処理 int sw3onCnt = 0; int sw3offCnt = 0; void sw3process(){ if(sw3Status == 0){ if(digitalRead(SW3) == HIGH){ sw3onCnt++; if(sw3onCnt == SW_ONDELAY){ //ON送信 sendSocket("LED3ON\r");; sw3Status = 1; sw3offCnt = 0; }else if(sw3onCnt > SW_ONDELAY){ sw3onCnt = SW_ONDELAY; } }else{ sw3onCnt = 0; } }else{ if(digitalRead(SW3) == LOW){ sw3offCnt++; if(sw3offCnt == SW_OFFDELAY){ //OFF送信 sendSocket("LED3OFF\r"); sw3Status = 0; sw3onCnt = 0; }else if(sw3offCnt > SW_OFFDELAY){ sw3offCnt = SW_OFFDELAY; } }else{ sw3offCnt = 0; } } } //SW4の処理 int sw4onCnt = 0; int sw4offCnt = 0; void sw4process(){ if(sw4Status == 0){ if(digitalRead(SW4) == HIGH){ sw4onCnt++; if(sw4onCnt == SW_ONDELAY){ //ON送信 sendSocket("LED4ON\r");; sw4Status = 1; sw4offCnt = 0; }else if(sw4onCnt > SW_ONDELAY){ sw4onCnt = SW_ONDELAY; } }else{ sw4onCnt = 0; } }else{ if(digitalRead(SW4) == LOW){ sw4offCnt++; if(sw4offCnt == SW_OFFDELAY){ //OFF送信 sendSocket("LED4OFF\r"); sw4Status = 0; sw4onCnt = 0; }else if(sw4offCnt > SW_OFFDELAY){ sw4offCnt = SW_OFFDELAY; } }else{ sw4offCnt = 0; } } } //タイマ割り込み時の処理 void ticker1_interrupt(){ if(ledStatus == 0){ digitalWrite(LED, LOW); }else if(ledStatus == 1){ digitalWrite(LED, HIGH); }else if(ledStatus == 2){ digitalWrite(LED, !digitalRead(LED)); } }
Nintendo 3DSでボタンを連打したいときってありますよね。ドラクエのカジノのスロットとかドラクエのカジノのスロットとか。Youtubeとか見ているとLEGOとかモーターの回転とかで連打するように工夫している方もいらっしゃるようですが、ここで解説するのはアマゾンで買えるやっすいソレノイドを使ったバージョンっていう感じのものです。他に使ってる材料もそこらへんに転がっているものばかりなので皆さんも興味を持っていただけたら参考にしてください。
ソレノイドって何?
↑こんなやつです。
ソレノイドとは、電気を流すと中の棒が動く電磁石を利用した電気部品で、これを使って電気をオン・オフして中の棒を動かし、それでボタンを連打しようという魂胆。
実際に私が買ったソレノイドはアマゾンで317円。安い!
とりあえず、動画にしてみたので、ここに貼っておきます。ソレノイドの動きがどんなもんかわかるかと。。。
電気のオン・オフを自動でやらせたいので、こちらもアマゾンで格安で手に入るArduino Nano互換品を使用します。
↑こんな感じのです。これもアマゾンで400円前後!
では実際に回路を考えてみます。
考えてみました…。
上記回路図のコメント
・電源はACアダプタでとる
・ソレノイドの定格が12V1Aなのでそれ相当のACアダプタを用意
(こっそり言うと、そんなACアダプタないよって人は昔の重いトランスタイプのACアダプタなら表示以上の電流が出たりするのでそういうのを使うのも手かもです)
・回路図ではトランジスタを使っていますが、FETやフォトカプラのほうが良いかもしれません。今回は、とりあえずそこらへんにあって使えそうなものを採用しました。
実際に部品を用意して基板にハンダしてみました。
続いてArduinoのプログラムを書いて行きます。
Arduinoの開発環境は公式ページから無料でダウンロードできますし、ブラウザ上で開発するWEB EDITORもあります。
詳しくは、解説しているサイトが沢山あるのでググりましょう(๑´ڡ`๑)テヘペロ
それでは実際にArduino Nano(互換品)に書込んで見ます。以下のプログラムをArduino IDEにコピペしてコンパイル、書き込みをしてみてください。
//ソレノイド連射Arduino Nanoプログラム int statusmode = 0; //0:連射OFF 1:連射ON int swcount=0; //SWのチャタリング防止用カウンタ void setup() { // シリアルポートを9600bpsで初期化 Serial.begin(9600); pinMode(2, OUTPUT); //ソレノイドへ出力 pinMode(12, INPUT); //SW入力 pinMode(13, OUTPUT); //LED出力 } void loop() { int val ; int inputchar; //プッシュSW入力処理 //プッシュSW入力トグルで切替え(連射中/停止中) if(digitalRead(12)==HIGH){ swcount++; }else{ swcount=0; } if(swcount>100){ swcount=0; if(statusmode==0){ statusmode=1; }else if(statusmode==1){ statusmode=0; } } //SW入力以外にもパソコンから //USBシリアル通信で's'で連射開始、'f'で連射停止も可能 inputchar = Serial.read(); switch(inputchar){ case 's'://start statusmode = 1; break; case 'f'://finish statusmode = 0; break; } // 半固定抵抗からの読込み値(連射の速度をアナログで変更) val = analogRead(0) ; //ソレノイドのオン・オフ処理 if(statusmode == 0){ digitalWrite(13,LOW); }else if(statusmode == 1){ digitalWrite(13,HIGH); digitalWrite(2, HIGH); delay(100); digitalWrite(13,LOW); digitalWrite(2, LOW); delay(val); } }
(最初にことわっておきますが、PICからWROOMへATコマンドを送って時刻を取得します。Arduinoでやるやり方ではないです。)
PICマイコンとESP-WROOM-02で電波時計ならぬ、インターネットへ接続しNTPサーバから時刻を取得し自動で時刻修正する時計を作っていきたいと思います。早い話、電波時計のインターネット版だと思ってください。
夏休みの自由研究なんかにうってつけなんじゃないでしょうか?
概要:
・PICはPIC18F25K22-I/SPを使用
・ESP-WROOM-02は公式のNONOSファーム v1.5.4を使用
・プログラムを作って書込むのはPICだけ
・PICとWROOMの通信はUSARTでATコマンドを使用
・7セグをダイナミック点灯。7セグは秋月の[OSL40391-LG]を使用
・時計用のクロックは32.768kHz水晶発振子を使用
・1日に1回時刻を自動修正
・開発環境はMPLAB X v3.30, xc8 v1.3.7を使用
回路は以下の通り。
LED用の抵抗値は使用するLEDに合わせて適宜変えてください。
MPLAB X用プロジェクトファイル
ダウンロード:PIC18F25k22_WifiClock160622a.zip
このプログラムの改変は自由に行ってもらっても良いですが、再配布や直リンクは禁止とします。また、営利目的のための使用も禁止します。
このサイトへのリンクは歓迎です。
使い方:
①まずは、プログラムをご自分のWifi環境に書き換えてください。
変更する箇所はmain.cの冒頭のここの部分。
書換えたらビルドしてPICに書込んでください。
②初回起動時はSW1またはSW2を押したまま電源を投入するとWifiアクセスポイントへ接続をここみます。LEDが点灯したらSWを離してください。
2回目以降の起動はSWを押しながらでなくても最後に接続したアクセスポイントをWROOMは覚えているので自動で接続します。
(Wifiアクセスポイントの設定は2つ登録でき、SW1を押しながらのときとSW2を押しながらのときで切り替えることが可能)
③LEDが点滅になると時刻を調整している最中です(約1分)。
④約1分後、LEDが消灯すれば調整は成功。LEDが点灯だと失敗です。
通常時のスイッチ操作について
SW1を押すと押している間、時刻表示から秒表示に切り替わります。
時刻表示中にSW2を押すと時刻を1分進めます。長く押すとどんどん進めます。
秒表示中にSW2を押すと現在の時刻のまま秒だけ0秒にします。
前回の記事の通り、WROOM-02に書かれているファームウェアが古かったので新しいものを書き込んでみたいと思います。今回ここで行うのはATコマンドを使えるファームです。
では、最新版をダウンロードします。
(ファームは日々更新されています。さらに新しいバージョンが出ていたら適宜読み替えて行ってください)
●ファームウェアのデータ本体のダウンロード先は
http://www.espressif.com/en/support/download/sdks-demos
2016/06/12現在最新のESP8266 NONOS SDK V1.5.4をダウンロードしました。
ちなみにATコマンド対応のファームはNONOSというやつです。
最新版のリリースなどいろいろとフォーラム内でアナウンスされているので、詳しく知りたい人はそちらで確認してください。→ESPRESSIFのフォーラム
●書込みツール「ESP8266 Flash Download Tools v2.4」のダウンロードはココ
http://www.espressif.com/en/support/download/other-tools
追記:リンク先のサイトが更新されました。「ESP8266 Flash Download Tools v3.3.4」がリリースされたようですが、まだ試していません。
●資料のpdf「ESP8266 AT Instruction Set」もダウンロードしておきましょう
http://www.espressif.com/en/support/download/documents
↑下線の補足にあるようにダウンロードしたファームウェアバージョンに対応したpdf資料
●回路の修正「IO0をグランドに」
ファームウェアを書き換えるにはIO0をグランド側につなげてあげる必要があります。
パソコン側の接続方法の詳細は前にやったここを参考にしてください。
前回までで配線はできたので、今回は実際にソフトを使って通信してみます。一番オーソドックスなソフトでやっていきたいと思います。また、当サイトで解説しているのはWindowsでのやり方です。MacやLinuxはわからないのでスミマセン。
まず、通信用ソフトとして「TeraTerm」というフリーソフトをインストールします。
窓の杜 http://forest.watch.impress.co.jp/library/software/utf8teraterm/
ここに書いてあるバージョンと違っても、そのときの最新版をダウンロードしてインストールすれば問題ないと思います。今回はv4.91をダウンロードしました。
インストールしてTeraTermを起動します。このときWROOMに3.3Vの電源はまだつなげないでおきます。
シリアルのラジオボタンを選択して、接続するポートを選択します。人によってここの表示は違います。我が家の環境では、COM1がデスクトップPCの裏側についているシリアルポート。COM3がサンワサプライのUSBシリアル変換器。COM4がFT232RLのUSBシリアル変換モジュールでした。
上部のメニューから設定→端末 を選んで送信コードをCR+LFにしOKを押します。
さらに、設定→シリアルポートでボーレートを115200にしてOKを押します。
WROOMに3.3Vの電源をつなげてみます。文字化けした文字が流れ最後にreadyと表示されたら接続は成功です。readyが表示されないときはボーレートが違ってたり、違うCOMポートだったりするので設定を見直してください。
AT+GMR⏎
と入力してみます。するとWROOMに書かれているファームウェアのバージョンが表示されます。
今回の例では
AT version:0.40.0.0
SDK version:1.3.0
で、2015年の8月のバージョンだということがわかりました。
今となっては古いので次回はファームウェアの更新をしてみたいと思います。
最近はやっているという噂の技適OKな格安WIFIモジュール「ESP-WROOM-02(以下WROOM)」を秋月で買ってみたのでちょこちょことこれについて書いてみたいと思います。
で、今回やってみたかったのはインターネットに接続して自動で時刻修正する7セグ時計です。
電子工作初心者なので成功するかどうかも未知数ですがお付き合いください。
パソコンとWROOMを接続してテストするには次の回路のように接続します。
ざっくり「パソコン側○○へ」と書いてますが、USARTのシリアル通信ができればどんなんでもOKです。あと電源は3.3V 2.0AのACアダプタを使いました。WROOMにGNDピンが3つあるけど、内部でつながっているのでどれか1つで良いのでグランドにつなげてください。
パソコン側はいろんな方法があると思うけど、今回2つの方法で試してみました。どちらも秋月とかで簡単に手に入るので持ってない人は一緒に買うと良いかもです。
①FT232RLを使った仮想USBシリアル通信
②ADM3202ANを使ったRS-232Cレベル変換でシリアル通信
では①の方法で必要なのは
FT232RL USBシリアル変換モジュール
http://akizukidenshi.com/catalog/g/gK-01977/
たぶんこの方法が一番一般的だと思います。接続の回路図はさっきの回路図に追加して書くと次のような感じ。
パソコン側はUSBなのでどのパソコンでもOKですし、抵抗とかコンデンサとか使わなくても簡単に接続できるのでおススメです。950円出す価値はあります。ちなみにFT232RLの3V3OUTからUSBのバスパワーを3.3Vに変換した電源がでているから、わざわざACアダプタを使わなくても良いのでは?と思いますが、容量不足でファーム書込み中とかに落ちたりしたら厄介なのでおとなしく最初からACアダプタを使いました。グランドマークは全部同じ電位するためにケーブルやジャンパ線で結線してください。
②の方法で必要なのは
ADM3202AN
http://akizukidenshi.com/catalog/g/gI-03030/
ちょっと古いやり方ですがこちらも問題なくできました。
こちらも複数あるグランドマークは全部結線してください。
パソコン側はRS-232Cなのでちょっと古めのデスクトップPCを使っている人か、こんなような↓USBシリアル変換器をもっている人用になります。
私はサンワサプライのこれを持っていたので使いました。
あと、RS-232Cの延長ケーブル使う場合はクロスとかストレートとかあるので注意してください。
それでは実際にパソコンを使って通信する方法は次の記事で。