Arduinoã§é»åèšïŒé·æéåãã
ãµãŒããŒãã¯ã©ãŠãã«ç§»èšããé£ç¶ããŠé»æµå€ã枬å®ã§ããããã«ãªããçµæããã©ãŠã¶ãŒã§ãªã¢ã«ã¿ã€ã ã«ã°ã©ãåããŠç¢ºèªã§ããããã«ãªããŸãããããã2æ¥ãããã¯é£ç¶åäœãããã®ã®ããã®åŸãArduinoãããµãŒããŒã«ããŒã¿ãŒãéãããªããªã£ãŠããŸããŸããé»åã®å©çšç¶æ³ã¯äžå¹Žãããã¯ç¶ç¶ããŠèª¿ã¹ããã®ã§ãé»åèšã¯å¹Žåäœã§é£ç¶åäœã§ããããã«ããŠãããããã®ã§ãããšããããšã§ä»åã¯Wi-Fiéä¿¡ã®å®å®åã®åãçµã¿ã«ã€ããŠæžããŸããå®å®åããããŸã§ã«1ã¶æãããããã£ãèšé²ãªã®ã§ã話ãå°ãé·ããªããŸããã
2æ¥çšåºŠã¯é£ç¶ããŠåãã®ã§ãåçŽãªããã°ã©ã ã®ãã°ã§ã¯ãªãããã§ããWi-Fiã®éä¿¡ããããã¯Wi-Fiãçµç±ããWebãµãŒããŒãšã®éä¿¡ãäžå®å®ã§ãArduinoã®ããã°ã©ã ãéä¿¡ã§ããªããªã£ãŠããŸãã®ã ãããšèããŸããã
ããŒã¿ãŒéä¿¡ãæ¢ãŸã£ãŠããŸã£ãæ§åã§ãã0æ30åé ãæåŸã«ããŒã¿ãŒéä¿¡ãæ¢ãŸã£ãŠããŸãã18æéãã«Arduinoã®ãªã»ãããã¿ã³ãæŒããŠéä¿¡ãåéãããŠããŸãã
ããŒã¿ãŒéä¿¡ãæ¢ãŸã£ããšãäœãèµ·ãã£ãŠããã調ã¹ãÂ
Wi-Fiéä¿¡ã«äœ¿ã£ãŠããã®ã¯TI瀟ã®CC3000ãšããWi-Fiéä¿¡çšããããæèŒããSparkFun瀟ã®ããŒã(Arduinoçšã·ãŒã«ã)ã§ããÂ
SparkFunã¯ãã®ããŒãã䜿ãããã®Arduinoçšã©ã€ãã©ãªãŒãæäŸããŠããŸãããœãŒã¹ã³ãŒãã¯ä»¥äžã«ãã¹ãŠå
¬éãããŠããŸãã
https://github.com/sparkfun/SFE_CC3000_Library
é»åèšã§äœ¿ã£ãŠããäž»ãªé¢æ°ã¯ä»¥äžã®éãã§ãã
class SFE_CC3000ã®é¢æ° init() // åæå startSmartConfig() // ã¹ããã®SmartConfigã¢ããªã䜿ãSSIDãš // ãã¹ã¯ãŒããæå®ããŠWi-Fiã«æ¥ç¶ fastConnect() // SmartConfigã§æå®ããããŒã¿ãŒã䜿ã£ãŠWi-Fiã«æ¥ç¶ class SFE_CC3000_Clientã®é¢æ° connect() // ãµãŒããŒã«TCPæ¥ç¶ãã write() // ãµãŒããŒã«ããŒã¿ãŒãéä¿¡ãã stop() // ãµãŒããŒãšã®æ¥ç¶ãåæãã
Arduinoã®é»åèšããã°ã©ã ã¯æ¬¡ã®ãããªæ§é ã§ãã
setup() { // Arduinoã®åæå颿° wifi.init(); // CC3000ãåæåãã if (!wifi.fastConnect()) { // fastConnectã§Wi-Fiã«ã€ãªã wifi.startSmartConfig(); // ã ããªãSmartConfigã§ã€ãªã } 30ç§ééã§ã¿ã€ããŒå²ã蟌ã¿ãèšå®; 30ç§ã¿ã€ããŒã®å²èŸŒã¿åŠç() { 30ç§åŸ
ã¡ãã©ã°ãè§£é€; } loop() { // Arduinoããã°ã©ã ã®åŠçã«ãŒã 30ç§åŸ
ã¡ãã©ã°ãè§£é€ãããã®ãåŸ
ã€; ã¯ã©ã³ã1ã®é»æµå€ã枬å®; ã¯ã©ã³ã2ã®é»æµå€ã枬å®; if (client.connect() == æå) { // WebãµãŒããŒã«TCPæ¥ç¶ããæåãªã client.write(黿µå€ããŒã¿ãŒ); // 黿µå€ããŒã¿ãŒãéä¿¡ãã client.stop(); // WebãµãŒããŒãšã®æ¥ç¶ãåæãã } }
ãŸããããã°ã©ã ãã©ãåããŠããã®ãã調ã¹ãŸããããã®ããã«Arduinoããããœã³ã³ã«ãããã°ã¡ãã»ãŒãžãåºåãããã£ãã®ã§ãããé»åã¢ãã¿ãŒã¯çé¢ã«ããåé»ç€è¿ãã«ãããããœã³ã³ã眮ãå ŽæããããŸãããããã§ãArduinoã«ç·ãšèµ€ã®LEDãã€ããããã䜿ã£ãŠããã°ã©ã ã®ç¶æ
ã衚瀺ããããã«ããŸãããæ¬¡ã®ãããªæãã§ãã
loop() { // Arduinoããã°ã©ã ã®åŠçã«ãŒã 30ç§åŸ
ã¡ãã©ã°ãè§£é€ãããã®ãåŸ
ã€; ã¯ã©ã³ã1ã®é»æµå€ã枬å®; ã¯ã©ã³ã2ã®é»æµå€ã枬å®; ç·ã®LEDãç¹ãã; if (client.connect() == æå) { // WebãµãŒããŒã«æ¥ç¶ ç·ã®LEDãæ¶ã; client.write(黿µå€ããŒã¿ãŒ); // 黿µå€ããŒã¿ãŒãHTTP POSTãã client.stop(); // WebãµãŒããŒãšã®æ¥ç¶ãåæãã } else { ç·ã®LEDãæ¶ããèµ€ã®LEDãç¹ãã; } }
LEDãç¹ç¯ãæ¶ç¯ããå Žæãå€ããªãã調ã¹ãçµæãäœããã®çç±ã§WebãµãŒããŒã«æ¥ç¶ã§ããªããªãããã®åŸã¯30ç§ããšã«WebãµãŒããŒãžã®æ¥ç¶(connect颿°)ã詊ã¿ãŠå€±æããããšãç¹°ãè¿ããŠããããšãåãããŸãããåäœã調ã¹ãéçšã§ã©ã€ãã©ãªãŒã®ãœãŒã¹ã³ãŒããèªãã ããWi-Fiã«ãŒã¿ãŒã®éä¿¡ãã°ã調ã¹ããããŸãããç¹ã«ä»¥äžã®äžã€ã®è³æã¯çè§£ã®å©ãã«ãªããŸããã
ãInternet of Things Wi-Fi Module API Documentationã
ãWiFiã®æ¥ç¶æç¶ãã®ã¯ãªãã
ãšã©ãŒæã®ç¶æ
ã調ã¹ããªã«ããªãŒããããã°ã©ã ã詊ã¿ã
è³æã調ã¹ããšãCC3000ã¯Wi-Fiæ¥ç¶ãåãããšèªåçã«åæ¥ç¶ã詊ã¿ãããã§ããããã§ãconnect()ã«å€±æããã®ã§ãCC3000ã®åæ¥ç¶ãããŸããã£ãŠããªããšãã仮説ãç«ãŠãŸãããconnect()ã«å€±æããæã®ç¶æ
ã調ã¹ããã®ç¶æ
ã«å¿ããŠãªã«ããªãŒããããã«ããã°ã©ã ãæ¹ä¿®ããããšãèããŸãããCC3000ã管çãããªããžã§ã¯ãã«ã¯ãåæåæžã¿ããWi-Fiã®ã¢ã¯ã»ã¹ãã€ã³ãã«æ¥ç¶æžã¿ããDHCPå®äºãã®äžã€ã®ç¶æ
ããããŸããDHCPã¯èªåã®IPã¢ãã¬ã¹ãDHCPãµãŒããŒã«ã¢ãµã€ã³ããŠãããæ©èœã§ããç·ãšèµ€ã®LEDã䜿ããconnect()ã«å€±æããæã®ç¶æ
ã調ã¹ããšããåæåæžã¿ããWi-Fiã¢ã¯ã»ã¹ãã€ã³ãæ¥ç¶æžã¿ãã§DHCPã¯å®äºããŠããå Žåãšããã§ãªãå ŽåããããŸãããWi-Fiã¢ã¯ã»ã¹ãã€ã³ããžã®æ¥ç¶ãšDHCPã¯fastConnect()ãšããã©ã€ãã©ãªãŒé¢æ°ã®äžã§ãããªãããŸããããã§ãconnect()ã«å€±æãããšãã«äžæŠWi-Fiã®æ¥ç¶ãåããfastConnect()ãããšããããã°ã©ã ã詊ããŸããããfastConnect()ã«å€±æãããªã«ããªãŒã§ããŸããã§ãããconnect()颿°ã®äžã§ãµãŒããŒã®æåååããIPã¢ãã¬ã¹ãæ±ããåŠçãšãIPã¢ãã¬ã¹ãæå®ããŠãµãŒããŒã«æ¥ç¶ããåŠçã®äºã€ãè¡ã£ãŠããã®ã§ãããã©ã€ãã©ãªãŒé¢æ°ã®äžãªã®ã§ããã®ã©ã¡ãã倱æããŠããã®ããåãããŸããã
Adafruit瀟ã®ã©ã€ãã©ãªãŒã詊ã
調ã¹ãŠããéçšã§ãAdafruitãšããäŒç€ŸãåãCC3000ãšããéä¿¡ããããæèŒããArduinoçšã®ããŒããšãã®ããŒãçšã®ã©ã€ãã©ãªãŒãéçºã販売ããŠããããšãåãããŸãããã©ã€ãã©ãªãŒã€ã³ã¿ãã§ãŒã¹ã調ã¹ããšãSparkFun瀟ã®ã©ã€ãã©ãªãŒãããåæ©èœã®é¢æ°ãæäŸãããŠããŸããAdafruit瀟ã®ã©ã€ãã©ãªãŒãœãŒã¹ã³ãŒãã以äžã®ãµã€ãã«ãã¹ãŠå
¬éãããŠããŸãã
https://github.com/adafruit/Adafruit_CC3000_Library
SparkFun瀟ïŒä»¥äžS瀟ïŒãšAdafruit瀟ïŒä»¥äžA瀟ïŒã®äž»ãªã©ã€ãã©ãªãŒé¢æ°ãæ¯èŒãããã®ã次ã§ãã
SparkFun瀟ã®ã©ã€ãã©ãªãŒ init() // åæå startSmartConfig() // SmartConfigæ©èœ fastConnect() // ååã®ããŒã¿ãŒã䜿ãWi-Fiã«æ¥ç¶ connect() // ãµãŒããŒã«TCPæ¥ç¶ãã connected() // æ¥ç¶ã確èªãã write() // ãµãŒããŒã«ããŒã¿ãŒãéä¿¡ãã stop() // ãµãŒããŒãšã®æ¥ç¶ãåã Adafruit瀟ã®ã©ã€ãã©ãªãŒ startSmartConfig() // SmartConfigæ©èœ begin() // ååã®ããŒã¿ãŒã䜿ãWi-Fiã«æ¥ç¶ checkDHCP() // DHCPå®äºãåŸ
〠getHostByName() // ãµãŒããŒåããIPã¢ãã¬ã¹ãåŸã connectTCP() // ãµãŒããŒã«TCPæ¥ç¶ãã connected() // æ¥ç¶ã確èªãã write() // ãµãŒããŒã«ããŒã¿ãŒãéä¿¡ãã close() // ãµãŒããŒãšã®æ¥ç¶ãåã
ç¹ã«ãä»åãšã©ãŒã«ãªãS瀟ã®connect()ãšãã颿°ãA瀟ã®ã©ã€ãã©ãªãŒã§ã¯getHostByName()ãšconnectTCP()ãšããäºã€ã®é¢æ°ã«åãããŠãããåé¡ã®åãåããã§ãããã§ããS瀟補ããŒãã«A瀟補ã©ã€ãã©ãªãŒãšããçµã¿åããã¯åããã©ããåãããŸãããã䞡瀟ãšãåäœä¿èšŒã¯ããŠãããªããšæããŸããããWiïŒFiå¶åŸ¡ãããã¯åãã§ãããS瀟補ããŒãïŒA瀟補ã©ã€ãã©ãªãŒã§åããããšããããã°èšäºããã£ãã®ã§ã詊ããŠã¿ãããšã«ããŸããã
ArduinoããŒããšãããšããããã³çªå·ãS瀟ã®ããŒããšA瀟ã®ããŒãã§ã¯ç°ãªããŸããäŸãã°å²èŸŒã¿èŠæ±ã¯S瀟ã2çªãã³ãªã®ã«å¯ŸããŠA瀟ã®ããŒãã¯3çªãã³ã䜿ã£ãŠããŸããããã§ããã°ã©ã ã®äžã§ãã³çªå·ãå®çŸ©ããŠããéšåãS瀟ããŒãçšã«æžãçŽããããšã¯ãã®ãŸãŸã³ã³ãã€ã«ãããšãããS瀟ããŒããšA瀟ã©ã€ãã©ãªãŒã®çµã¿åããã§åããããšãã§ããŸããïŒ
ãã®ç¶æ
ã§é£ç¶åäœããããšãããS瀟ã©ã€ãã©ãªãŒã®æãšåãããã«2ã3æ¥ã§ããŒã¿ãŒéä¿¡ãéçµ¶ããããšãåãããŸãããããã«ãã®æãgetHostByName()ãšãã颿°ã§å€±æããŠããããšãåãããŸãããããã§ã©ã€ãã©ãªãŒã®ãœãŒã¹ã³ãŒããèªãã§å
éšåŠçãçè§£ãããªã«ããªãŒããã°ã©ã ãæžãããšãèããã®ã§ãããåèã«ãªããµã³ãã«ããã°ã©ã ããªãã£ãã®ã§ãå¥ã®ã¢ãããŒãããŠã©ããããã°ã¿ã€ããŒã詊ã¿ãããšã«ããŸããã
ãŠã©ããããã°ã¿ã€ããŒã詊ã¿ã
ãŠã©ããããã°ã¿ã€ããŒã¯ãèšå®ããæéãŸã§ã«ã¿ã€ããŒãã¯ãªã¢ãŒããªããšã·ã¹ãã ããªã»ãããããšããæéç匟ã®ãããªæ©èœã§ããArduinoã§ããã°ã©ã ããã·ã¹ãã ããªã»ããããæ¹æ³ã¯ä»¥äžã®ããŒãžã«è§£èª¬ããããŸãã
http://playground.arduino.cc/Main/ArduinoReset
Arduinoã§ã¯ãŠã©ããããã°ã¿ã€ããŒã®ã©ã€ãã©ãªãŒãæäŸãããŠããŸãã以äžã®ããŒãžã«è§£èª¬ããããŸãã
http://nongnu.org/avr-libc/user-manual/group__avr__watchdog.html
ã©ã€ãã©ãªãŒã«ã¯æ¬¡ã®äžã€ã®é¢æ°ãçšæãããŠããŸãã
wdt_enable(value); // ãŠã©ããããã°ã¿ã€ããŒãæå¹ã«ãã wdt_reset(); // ãŠã©ããããã°ã¿ã€ããŒãã¯ãªã¢ãŒãã wdt_disable(); // ãŠã©ããããã°ã¿ã€ããŒãç¡å¹ã«ãã
ãªã»ãããããããŸã§ã®æé㯠wdt_enable() ã®ãã©ã¡ãŒã¿ãŒã§æå®ãã15mç§ãã8ç§ãŸã§ã®æéãèšå®ã§ããŸãããã®ã©ã€ãã©ãªãŒã¯ãArduinoã®CPUã¯ç¢ºå®ã«ãªã»ããã§ããŸãããã·ãŒã«ããšåŒã°ããæ¡åŒµããŒããŸã§ãªã»ããã§ãããã¯åãããªãããšArduinoå
¬åŒãµã€ãã«æžãããŠããŸãããããšãããã䜿ã£ãŠã¿ãããšã«ããŸãããäŸãã°getHostByName()ãåŒã¶ååŸã«äžèšã®ããã«ãŠã©ããããã°ã¿ã€ããŒãã»ããããŸããã
wdt_enable(WDTO_8S); // 8ç§ã®ãŠã©ããããã°ã¿ã€ããŒãã»ãã for (ip = 0; cc3000.getHostByName(domain, &ip), ip == 0; ) { // getHostByName() ããŠãipã¢ãã¬ã¹ã0ãªã delay (500); // 500mç§åŸ
ã£ãŠã忿Р} wdt_reset(); // 8ç§ä»¥å
ã«åŠçãçµããã°ã¿ã€ããŒãã¯ãªã¢ãŒ wdt_disable(); // ã¿ã€ããŒãç¡å¹å
Wi-Fiéä¿¡ã©ã€ãã©ãªãŒãåŒã³åºããŠãããšããã®ååŸã«ãã®ããã«ãŠã©ããããã°ã¿ã€ããŒãã»ããããä»®ã«ã©ã€ãã©ãªãŒã®äžã§æ¢ãŸã£ãŠããŸã£ãŠãã·ã¹ãã ããªã»ãããããããã°ã©ã ãæåããåå®è¡ãããããã«ããŸããã
ãŠã©ããããã°ã¿ã€ããŒãå
¥ããŠããã¯ããŒã¿ãŒéä¿¡ãæ¢ãŸãããšãªããé£ç¶ããŠåäœããããã«ãªããŸããããµãŒããŒã«ããŒã¿ãŒãå°çããééã調ã¹ãã®ã次ã®ã°ã©ãã§ãã
äœãåé¡ããªããã°30ç§ããšã«ããŒã¿ãŒãå°çããŸããã°ã©ãã§ã¯ããŒã¿ãŒã®å°çééãç·ã®ç¹ã§ç€ºããŠãããããã垯ç¶ã«30ç§(å³è»ž)ã®ã©ã€ã³ã«äžŠãã§ããŸãã0æ30åé ã«å°çééã3å30ç§ãããã«äŒžã³ãŠããŸããããã§getHostByName()ã«å€±æãããŠã©ããããã°ã¿ã€ããŒãã¯ãªã¢ãŒã§ãããã·ã¹ãã ããªã»ãããããããã°ã©ã ãæåããåå®è¡ãããããŒã¿ãŒéä¿¡ãåéããŠããŸãã
é»åã¢ãã¿ãŒã¯ãŠã©ããããã°ã¿ã€ããŒãå
¥ããããšã§é£ç¶ããŠåäœãããããšãã§ããŸããããã ããéä¿¡ã®é害ã¯ã©ã®ã¿ã€ãã³ã°ã§ãèµ·ããåŸãŸããäŸãã°ããŒã¿ãŒéä¿¡ã®éãããŒã¿ãŒãéäžãŸã§éä¿¡ãããåŸã«é害ãçºçããå¯èœæ§ããããŸãããã®æãé»åã¢ãã¿ãŒã®ç«¯æ«ã§ããArduinoã¯ãŠã©ããããã°ã¿ã€ããŒã«ããåèµ·åãããŸããããµãŒããŒåŽã«ã¯äžéå端ãªããŒã¿ãŒãæ®ãå¯èœæ§ããããŸããä»åã¯å¯ŸåŠããŠããŸãããããµãŒããŒåŽããã°ã©ã ã§ãäžå®å
šãªããŒã¿ãŒã¯ç¡èŠãããªãåé€ãããªããšãã£ãåŠçãå¿
èŠã«ãªããŸãã
ããã§é£ç¶ããŠé»æ°ã®å©çšç¶æ³ãåããããã«ãªããŸãããæ¬¡ã¯ã°ã©ã衚瀺ã匷åããŸãã