ä»åã¯ãäºé²æªçœ®ãšããŠèªè»¢è»ã«GPSãã©ãã«ãŒãé ãããšãèããŸããã åžå Žã«ã¯ãè»ã貚ç©ãèªè»¢è»ãè·ç©ãåäŸãåç©ã远跡ããããã®å€æ°ã®èªåŸåããã€ã¹ããããŸãã ãããã®å€§éšåã¯ãSMSãä»ããŠãŠãŒã¶ãŒãšå¯Ÿè©±ããŸãã ããé«äŸ¡ãªãªãã·ã§ã³ã¯ãé»è©±æ€çŽ¢æ©èœãæäŸããŸãããç¹å®ã®ãªã³ã©ã€ã³ãµãŒãã¹ã«é¢é£ä»ããããŠããŸãã
çæ³çã«ã¯ããã©ãã«ãŒãå®å
šã«å¶åŸ¡ããããšæããŸããSMSãšç»é²ãªãã§äŸ¿å©ãªã¢ãŒãã§ãã©ãã«ãŒã䜿çšããŠãã ããã 衚é¢çãªã°ãŒã°ã«ã¯ç§ã«äžåœããããã€ãã®ã¢ãžã¥ãŒã«ãæã£ãŠããŠããã®ãã¡ã®äžã€ã泚æããŸããïŒA9Gããªã³ããŒãïŒïŒã$ 15ïŒã
ãã®èšäºã§ã¯ããã®ã¢ãžã¥ãŒã«ã§pythonãåäœãããæ¹æ³ã«ã€ããŠèª¬æããŸãã
A9GãESPã®ã¢ããã°ã§ããå ŽåïŒè£œé å ã¯åãã§ãïŒãããªã³ãã£ã³ã°ããŒãèªäœã¯NodeMCUããŒãã®ã¢ããã°ã§ãããã ããããªã³ãã£ã³ã°ããŒãã«ã¯USB-UARTã³ã³ããŒã¿ãŒãçµã¿èŸŒãŸããŠããªãç¹ãç°ãªããŸãã ããããä»ã«ãå€ãã®è峿·±ãããšããããŸãã ã¡ãŒã«ãŒä»æ§ïŒ
- 32ãããã³ã¢ïŒRISCïŒãæå€§312MHz
- 29x GPIOïŒãã¹ãŠã¯ãã ä»ããããŠããããã¹ãŠã®ã€ã³ã¿ãŒãã§ãŒã¹ããã®æ°ã«å«ãŸããŠããŸãïŒ
- æèšãšãŠã©ããããã°
- 1 x USB 1.1ã€ã³ã¿ãŒãã§ã€ã¹ïŒããã«ã¯èŠã€ãããŸããã§ãããããªããµã€ãããã³ããŒããŸãïŒããã³é»æºçšã®microUSB
- 2x UARTïŒ+1ãµãŒãã¹ïŒ
- 2x SPIïŒæªè©Šè¡ïŒ
- 3x I2CïŒè©ŠããŠããªãïŒ
- 1x SDMMCïŒç©çã¹ãããä»ãïŒ
- 2xã¢ããã°å ¥åïŒ10ãããããããããã®ãã¡ã®1ã€ããªããŠã 黿± ã³ã³ãããŒã©ãŒã§äœ¿çšãããïŒ
- 4Mbãã©ãã·ã¥
- 4Mb PSRAM
- ADCïŒãã€ã¯ãããŒãäžã«ç©ççã«ååšïŒããã³DACïŒã¹ããŒã«ãŒãäžåšïŒ
- ããããªãŒå é»ã³ã³ãããŒã©ãŒïŒããããªãŒèªäœã¯ãããŸããïŒ
- å®éãSMSãé³å£°ãGPRSãåããGSMïŒ800ã900ã1800ã1900 MHzïŒ
- UART2ãä»ããŠæ¥ç¶ãããGPSïŒãA9ãã¢ãžã¥ãŒã«ã¯ãããŸããïŒ
- SIMã¹ãããïŒnanoSIMïŒ
- 2ã€ã®ãã¿ã³ïŒ1ã€ã¯ãªã»ããããã1ã€ã¯å å«ããã³ããã°ã©ã å¯èœãªæ©èœïŒ
- 2ã€ã®LED
åäœé»å§ã¯3.3Vãå ¥åé»å§ã¯5ã3.8Vã§ãïŒæ¥ç¶ã«ãã£ãŠç°ãªããŸãïŒã äžè¬ã«ãã¢ãžã¥ãŒã«ã«ã¯ãã·ã³ãã«ãªããã·ã¥ãã¿ã³ã¢ãã€ã«ããã€ã¹ãçµã¿ç«ãŠãããã«å¿ èŠãªãã¹ãŠã®ããŒããŠã§ã¢ãå«ãŸããŠããŸãã ããããäŸãããäžåœäººã¯ãããã¹ããããã·ã³ãŸãã¯ã¹ããããã·ã³ãªã©ãã販売ããããã«è³Œå ¥ããŠããããã§ãã ã¢ãžã¥ãŒã«ã®ä»£æ¿åã¯éåžžã«äººæ°ã®ããSIM800ã¢ãžã¥ãŒã«ã§ãæ®å¿µãªãããããªãã¯ãã¡ã€ã³ã«SDKããããŸããïŒã€ãŸããã¢ãžã¥ãŒã«ã¯ATã¢ãã ãšããŠè²©å£²ãããŠããŸãïŒã
SDK
ã¢ãžã¥ãŒã«ã«ã¯ãæºè¶³ã®ããè±èªã®SDKãä»å±ããŠããŸã ã Ubuntuã®äžã«ã€ã³ã¹ããŒã«ããŸãããWindowsãšã³ã³ãããåªå
ãããŸãã GUIã§ã®ç¢ºèªã«ãã£ãŠãã¹ãŠãæ©èœããŸãããã®ã¢ãžã¥ãŒã«ã®ESPtoolã¯ãŸã å
ã«æ»ãããŠããŸããã ãã¡ãŒã ãŠã§ã¢èªäœã¯Makefileã«ãã£ãŠæ§ç¯ãããŸãã ãããã¬ãŒãååšããŸããããªãŒãºããåã«ãã¢ãžã¥ãŒã«ã¯ã¹ã¿ãã¯ãã¬ãŒã¹ããµãŒãã¹ããŒãã«ã¹ããŒããŸãã ããããå人çã«ã¯ãã¢ãã¬ã¹ãã³ãŒãè¡ã«å€æã§ããŸããã§ããïŒgdbã¯ãã¢ãã¬ã¹ãäœã«ã察å¿ããŠããªããšå ±åããŠããŸãïŒã ããã¯ãLinuxã®ãµããŒããäžååã§ããããšãåå ã§ããå¯èœæ§ããããŸãã ãããã£ãŠãã¢ãžã¥ãŒã«ããããããå Žåã¯ãWindowsã§å®è¡ããŠã¿ãŠãã ããïŒãããŠgithubã§ãµãã¹ã¯ã©ã€ããè§£é€ããŸãïŒã ãã以å€ã®å Žåã¯ãLinuxã®æé ã以äžã«ç€ºããŸãã ã€ã³ã¹ããŒã«åŸã.bashrcã®ãã¹ã®æ£ç¢ºãã確èªãããã¹ãŠã®CSDTK/lib/libQt*
ãåé€ïŒåå倿ŽïŒããå¿
èŠããããŸãã
ãã©ãã·ã£ãŒã«æç€ºããããŸã ã
æ¥ç¶
ãã¹ãŠãNodeMCUãããè€éã§ãã ã¢ãžã¥ãŒã«ã¯äŒŒãŠããŸãããããã£ã³ã°ããŒãã«ã¯USB-TTYãããããªããmicroUSBã¯é»æºã«ã®ã¿äœ¿çšãããŸãã ãããã£ãŠã3.3Vã®USB-TTYãå¿ èŠã§ãã ãããã°ããŒãçšãšUART1çšã®2ã€ãåªããŠããŸãã1ã€ç®ã¯ãã¡ãŒã ãŠã§ã¢ã®ã¢ããããŒãã«äœ¿çšããã2ã€ç®ã¯éåžžã®ç«¯æ«ãšããŠäœ¿çšã§ããŸãã ãããã®ãã¹ãŠã®éŒ»æ°Žãã³ã³ãã¥ãŒã¿ãŒã«ãã©ãã°ããªãããã«ã2ã¡ãŒãã«ã®ã±ãŒãã«ãšå€éšé»æºãåãã4ããŒãUSBã¹ããªãã¿ãŒã远å ã§è³Œå ¥ããŸããïŒå¿ é ïŒã ã¢ãžã¥ãŒã«èªäœãå«ããã®ãããã®åèšè²»çšã¯25ã30ãã«ã§ãïŒé»æºãªãïŒé»è©±ããã®äœ¿çšïŒã
ãã¡ãŒã ãŠã§ã¢
ã¢ãžã¥ãŒã«ã«ã¯ATãã¡ãŒã ãŠã§ã¢ãä»å±ããŠããŸãã3.3Varduinoã«æ¥ç¶ããUART1çµç±ã§ã¢ãã ãšããŠäœ¿çšã§ããŸãã ãã¡ãŒã ãŠã§ã¢ã¯Cã§èšè¿°ãããŠããŸããmakeã¯2ã€ã®ãã¡ãŒã ãŠã§ã¢ãã¡ã€ã«make
äœæããŸãã1ã€ã¯çŽ1åéçž«ãä»ãããããã1ã€ã¯ååé«éã§ãã ãããã®ãã¡ã€ã«ã®1ã€ã ããçž«ãããšãã§ããŸããæåã®æéã¯å€§ããããã以éã®æéã¯å°ãããªããŸãã å
šäœãšããŠãéçºããã»ã¹äžã«ãã¢ãžã¥ãŒã«ãstdioãšããŠã®ããã¿ãŒã ãããã³ãã¹ã¯ãããäžã®ã³ãŒããšãã£ã¿ãŒã管çããããã«ãäžåœèªSDKïŒ coolwatcher
ïŒãcoolwatcher
ãŠããŸãã
API
APIã®å 容ã¯äžéšã®ãªã¹ããåæ ããŠãããåæã®ESP8266ã«äŒŒãŠããŸããHelloWorldãèµ·åããã®ã«çŽ3æéããããŸããã æ®å¿µãªããããŠãŒã¶ãŒã䜿çšã§ããæ©èœã®ã»ããã¯éåžžã«éãããŠããŸããããšãã°ãSIMã«ãŒãã®é»è©±åž³ãžã®ã¢ã¯ã»ã¹ãã»ã«ã©ãŒãããã¯ãŒã¯ãžã®æ¥ç¶ã«é¢ããäœã¬ãã«ã®æ å ±ãªã©ããããŸããã APIããã¥ã¡ã³ãã®å®æåºŠã¯ããã«äœãããããµã³ãã«ïŒãã®ãã¡ã®12åïŒã«äŸåãããã¡ã€ã«ãã€ã³ã¯ã«ãŒãããå¿ èŠããããŸãã ããã«ãããããããã¢ãžã¥ãŒã«ã¯SSLæ¥ç¶ãŸã§å€ãã®ããšãå®è¡ã§ããŸããæããã«ãè£œé æ¥è ã¯æãåªå 床ã®é«ãæ©èœã«çŠç¹ãåãããŸããã
ãã ããäžåœã®APIãä»ããäžåœã®ãã€ã¯ãã³ã³ãããŒã©ãŒã®ããã°ã©ãã³ã°ã¯æãããªããã°ãªããŸããã ä»ã®ãã¹ãŠã®äººã«ãšã£ãŠãã¡ãŒã«ãŒã¯ãã®ã¢ãžã¥ãŒã«ã«micropythonãç§»æ€ãå§ããŸãã ã ç§ã¯ãªãŒãã³ãœãŒã¹ãããžã§ã¯ãã«ææŠãããã®åè¡ãç¶ããããšã«ããŸããïŒèšäºã®æåŸã«ãªã³ã¯ããããŸãïŒã
ãã€ã¯ããã€ãœã³
Micropythonã¯ãcPythonããã€ã¯ãã³ã³ãããŒã©ãŒã«ç§»æ€ãããªãŒãã³ãœãŒã¹ãããžã§ã¯ãã§ãã éçºã¯2ã€ã®æ¹åã§è¡ãããŸãã 1ã€ã¯ãPythonã®åºæ¬çãªããŒã¿åïŒãªããžã§ã¯ãã颿°ãã¯ã©ã¹ãæååãã¢ãããã¯åãªã©ïŒã®æäœãèšè¿°ãããã¹ãŠã®ãã€ã¯ãã³ã³ãããŒã©ãŒã«å
±éã®ã³ã¢ã©ã€ãã©ãªã®ãµããŒããšéçºã§ãã 2ã€ç®ã¯ãå®éã«ã¯ããŒãã§ããåãã€ã¯ãã³ã³ãããŒã©ãŒã«å¯ŸããŠãå
¥åºåçšã®UARTã§åäœããã©ã€ãã©ãªããæãããå¿
èŠããããä»®æ³ãã·ã³ã®ã¹ã¿ãã¯ãéžæããæé©åã®ã»ãããæå®ããŸãã ãªãã·ã§ã³ã§ãGPIOã黿ºãã¯ã€ã€ã¬ã¹ããã¡ã€ã«ã·ã¹ãã ãªã©ã®ããŒããŠã§ã¢ã®æäœã«ã€ããŠèª¬æããŸãã
ãããã¯ãã¹ãŠããã¯ãã䜿çšããŠçŽç²ãªCã§èšè¿°ãããŠããŸããmicropythonã«ã¯ãROMå
ã®æååã®å®£èšããã¢ãžã¥ãŒã«ã®äœæãŸã§ãäžé£ã®æšå¥šã¬ã·ãããããŸãã ããã«å ããŠãPythonã®èªå·±äœæã¢ãžã¥ãŒã«ãå®å
šã«ãµããŒããããŠããŸãïŒäž»ãªããšã¯ãã¡ã¢ãªãµã€ãºãå¿ããªãããšã§ãïŒã ãããžã§ã¯ãã®ãã¥ã¬ãŒã¿ãŒã¯ã dzhanga ïŒãã³ã®å¡ã®åçïŒ ãçºå£²ããæ©äŒã圌ãã®ç®æšãšããŠèšå®ããŸããã åºåãšããŠïŒãããžã§ã¯ãã¯ã pyboardã®åŠçåãã«ç¬èªã®ããŒãã販売ããŠããŸãããESP8266ããã³ESP32ã¢ãžã¥ãŒã«çšã®ããŒãã人æ°ããããŸãã
ãã¡ãŒã ãŠã§ã¢ã®æºåãã§ããŠã¢ããããŒããããã-UARTãä»ããŠãã€ã¯ãã³ã³ãããŒã©ãŒã«æ¥ç¶ããPython REPLã«å ¥ããŸãã
$ miniterm.py /dev/ttyUSB1 115200 --raw MicroPython cd2f742 on 2017-11-29; unicorn with Cortex-M3 Type "help()" for more information. >>> print("hello") hello
ãã®åŸãã¡ã¢ãªã®å¶éãå¿ããããšãªããã»ãŒéåžžã®python3ã§æžã蟌ã¿ãéå§ã§ããŸãã
A9Gã¢ãžã¥ãŒã«ã¯å
¬åŒã«ã¯ãµããŒããããŠããŸããïŒå
¬åŒã«ãµããŒããããŠããã¢ãžã¥ãŒã«ã®ãªã¹ãã¯micropython/ports
ã§å
¥æã§ããŸãããããã¯çŽ12åãããŸãïŒã ããã«ãããããããéã¡ãŒã«ãŒã¯micropythonãåå²ãããA9GããŒãçšã®ç°å¢ãäœæããŸããïŒ micropython/ports/gprs_a9
ãåœŒã«æè¬ããŸãã ãã®åé¡ã«èå³ãæã€ããã«ãªã£ããšããããŒãã¯æ£åžžã«ã³ã³ãã€ã«ããããã€ã¯ãã³ã³ãããŒã©ãŒã¯REPLã§ç§ãè¿ããŠãããŸããã ããããæ®å¿µãªããšã«ããµãŒãããŒãã£ã®ã¢ãžã¥ãŒã«ããã¯ããã¡ã€ã«ã·ã¹ãã ãšGPIOã®ã¿ã§åäœããŸãããã¯ã€ã€ã¬ã¹ãããã¯ãŒã¯ãšGPSã«é¢é£ãããã®ã¯äœããããŸããã§ããã ãã®æ¬ é¥ãä¿®æ£ããGPSãã©ãã«ãŒã«å¿
èŠãªãã¹ãŠã®æ©èœãç§»æ€ãããšããç®æšãèšå®ããããšã«ããŸããã ãã®ã±ãŒã¹ã®å
¬åŒææžã¯äžå¿
èŠã«ç°¡æœã§ãããããã£ãŠãã³ãŒãã調ã¹ãªããã°ãªããŸããã§ããã
ã©ãããå§ããã
ãŸãã micropython/ports
ã«ç§»åãã micropython/ports/minimal
ãããŒããé
眮ãããæ°ãããã©ã«ããŒã«ã³ããŒããŸãã æ¬¡ã«ããã©ãããã©ãŒã ã®main.c
ãç·šéããŸãã ãã¹ãŠã®ãããããã®ã¯main
颿°ã«ããã mp_init()
ã€ãã·ã£mp_init()
ãåŒã³åºãå¿
èŠãããããã€ã¯ãã³ã³ãããŒã©ãŒãšã¹ã¿ãã¯èšå®ãäºåã«æºåããŠããããšã«mp_init()
ããŠãã ããã æ¬¡ã«ãã€ãã³ãé§ååAPIã®å Žåã pyexec_event_repl_init()
ãåŒã³åºããUARTãä»ããŠå
¥åãããæåãpyexec_event_repl_process_char(char)
颿°ã«pyexec_event_repl_init()
å¿
èŠããããŸãã ããã«ãããREPLã«ããçžäºéçšæ§ãæäŸãããŸãã 2çªç®ã®ãã¡ã€ã«ã micropython/ports/minimal/uart_core.c
UARTã§ã®å
¥åºåã®ãããã¯ã«ã€ããŠèª¬æããŠããŸãã æ¢ãã®ãé¢åãªäººã®ããã«ãSTM32ã®å
ã®ã³ãŒããçšæããŠããŸãã
main.c
int main(int argc, char **argv) { int stack_dummy; stack_top = (char*)&stack_dummy; #if MICROPY_ENABLE_GC gc_init(heap, heap + sizeof(heap)); #endif mp_init(); #if MICROPY_ENABLE_COMPILER #if MICROPY_REPL_EVENT_DRIVEN pyexec_event_repl_init(); for (;;) { int c = mp_hal_stdin_rx_chr(); if (pyexec_event_repl_process_char(c)) { break; } } #else pyexec_friendly_repl(); #endif //do_str("print('hello world!', list(x+1 for x in range(10)), end='eol\\n')", MP_PARSE_SINGLE_INPUT); //do_str("for i in range(10):\r\n print(i)", MP_PARSE_FILE_INPUT); #else pyexec_frozen_module("frozentest.py"); #endif mp_deinit(); return 0; }
uart_core.c
// Receive single character int mp_hal_stdin_rx_chr(void) { unsigned char c = 0; #if MICROPY_MIN_USE_STDOUT int r = read(0, &c, 1); (void)r; #elif MICROPY_MIN_USE_STM32_MCU // wait for RXNE while ((USART1->SR & (1 << 5)) == 0) { } c = USART1->DR; #endif return c; } // Send string of given length void mp_hal_stdout_tx_strn(const char *str, mp_uint_t len) { #if MICROPY_MIN_USE_STDOUT int r = write(1, str, len); (void)r; #elif MICROPY_MIN_USE_STM32_MCU while (len--) { // wait for TXE while ((USART1->SR & (1 << 7)) == 0) { } USART1->DR = *str++; } #endif }
ãã®åŸãã¡ãŒã«ãŒã®æšå¥šäºé
/ã³ã³ãã€ã©ã䜿çšããŠMakefileãæžãæããå¿
èŠããããŸããããã§ã¯ãã¹ãŠãåå¥ã§ãã ãã¹ãŠãçæ³çã«ã¯ããã§ååã§ãããã¡ãŒã ãŠã§ã¢ãåéããèšå
¥ããUARTã§REPLã確èªããŸãã
micropython
埩掻ãããåŸã¯ããã®å¹žçŠã«æ³šæããå¿
èŠããããŸãïŒã¬ããŒãžã³ã¬ã¯ã¿ãŒã®èšå®ãCtrl-Dãžã®æ£ããå¿çïŒãœãããªã»ããïŒãããã³ç§ã詳ãã説æããªããã®ä»ã®mpconfigport.h
ïŒ mpconfigport.h
ãã¡ã€ã«ãåç
§ããŠãã ããã
ã¢ãžã¥ãŒã«ãäœæãã
æãè峿·±ãã®ã¯ãç¬èªã®ã¢ãžã¥ãŒã«ãæžãããšã§ãã ãã®ãããã¢ãžã¥ãŒã«ïŒå¿
é ã§ã¯ãããŸãããæãŸããïŒã¯ã Makefile
ïŒ SRC_C
ã°SRC_C
倿°ïŒã«ãã£ãŠè¿œå ãããç¬èªã®mod[].c
ãã¡ã€ã«ã§SRC_C
ãŸãã 空ã®ã¢ãžã¥ãŒã«ã¯æ¬¡ã®ãšããã§ãã
// nlr - non-local return: C , goto- . // nlr_raise . #include "py/nlr.h" // . , mp_map_elem_t, , . #include "py/obj.h" // . mp_raise_ValueError(char* msg) mp_raise_OSError(int errorcode) . // , mp_call_function_* Callable ( callback-). #include "py/runtime.h" #include "py/binary.h" // header : #include "portmodules.h" // -- . MP_QSTR_[ ]. MP_OBJ_NEW_QSTR . // RAM. // - __name__ STATIC const mp_map_elem_t mymodule_globals_table[] = { { MP_OBJ_NEW_QSTR(MP_QSTR___name__), MP_OBJ_NEW_QSTR(MP_QSTR_mymodule) }, }; // STATIC MP_DEFINE_CONST_DICT (mp_module_mymodule_globals, mymodule_globals_table); // : const mp_obj_module_t mp_module_mymodule = { .base = { &mp_type_module }, .globals = (mp_obj_dict_t*)&mp_module_mymodule_globals, };
ãã¡ãããããŒãèªäœã¯mp_module_mymodule
宿°ãèªèããŸããMICROPY_PORT_BUILTIN_MODULES
ã®ããŒãèšå®ã®mpconfigport.h
倿°ã«è¿œå ããå¿
èŠããããŸãã ã¡ãªã¿ã« éå±ãªå£çŽ ãããåãšããŒãåãããã§å€æŽãããŸãã ããããã¹ãŠã®å€æŽã®åŸãã¢ãžã¥ãŒã«ãã³ã³ãã€ã«ããŠãREPLããã€ã³ããŒãããããšãã§ããŸãã ã¢ãžã¥ãŒã«ã§äœ¿çšã§ããã¢ãžã¥ãŒã«åãæã€__name__
屿§ã¯1ã€ã ã__name__
ïŒREPLã§Tabã䜿çšããŠèªåè£å®ããã§ãã¯ããå Žåã«æé©ã§ãïŒã
>>> import mymodule >>> mymodule.__name__ 'mymodule'
宿°
è€éãã®æ¬¡ã®æ®µéã¯å®æ°ã®è¿œå ã§ãã å€ãã®å Žåãèšå®ã«ã¯å®æ°ïŒ INPUT
ã OUTPUT
ã HIGH
ã LOW
ãªã©ïŒãå¿
èŠã§ããããã§ã¯ãã¹ãŠãéåžžã«åçŽã§ãã ããã§ãããšãã°ã宿°magic_number = 10
ïŒ
STATIC const mp_map_elem_t mymodule_globals_table[] = { { MP_OBJ_NEW_QSTR(MP_QSTR___name__), MP_OBJ_NEW_QSTR(MP_QSTR_mymodule) }, { MP_OBJ_NEW_QSTR(MP_QSTR_magic_number), MP_OBJ_NEW_SMALL_INT(10) }, };
ãã¹ãïŒ
>>> import mymodule >>> mymodule.magic_number 10
æ©èœ
ã¢ãžã¥ãŒã«ãžã®é¢æ°ã®è¿œå ã¯ã宣èšãã©ããã远å ãšããäžè¬çãªååã«åŸããŸãïŒããã¥ã¡ã³ããããå°ãè€éãªäŸã瀺ããŸãïŒã
// STATIC mp_obj_t conditional_add_one(mp_obj_t value) { // int. - : . int value_int = mp_obj_get_int(value); value_int ++; if (value_int == 10) { // None return mp_const_none; } // int return mp_obj_new_int(value); } // . // runtime.h . STATIC MP_DEFINE_CONST_FUN_OBJ_1(conditional_add_one_obj, conditional_add_one); // STATIC const mp_map_elem_t mymodule_globals_table[] = { { MP_OBJ_NEW_QSTR(MP_QSTR___name__), MP_OBJ_NEW_QSTR(MP_QSTR_mymodule) }, { MP_OBJ_NEW_QSTR(MP_QSTR_magic_number), MP_OBJ_NEW_SMALL_INT(10) }, { MP_OBJ_NEW_QSTR(MP_QSTR_conditional_add_one), (mp_obj_t)&conditional_add_one_obj }, };
ãã¹ãïŒ
>>> import mymodule >>> mymodule.conditional_add_one(3) 4 >>> mymodule.conditional_add_one(9) >>>
ã¯ã©ã¹ïŒã¿ã€ãïŒ
ã¯ã©ã¹ïŒã¿ã€ãïŒã䜿çšãããšããã¹ãŠãæ¯èŒçåçŽã§ãã ããã«ããã¥ã¡ã³ãã®äŸããããŸãïŒãŸããã»ãŒïŒïŒ
// STATIC const mp_map_elem_t mymodule_hello_locals_dict_table[] = {}; // STATIC MP_DEFINE_CONST_DICT(mymodule_hello_locals_dict, mymodule_hello_locals_dict_table); // , , const mp_obj_type_t mymodule_helloObj_type = { // { &mp_type_type }, // : helloObj .name = MP_QSTR_helloObj, // .locals_dict = (mp_obj_dict_t*)&mymodule_hello_locals_dict, }; // STATIC const mp_map_elem_t mymodule_globals_table[] = { { MP_OBJ_NEW_QSTR(MP_QSTR___name__), MP_OBJ_NEW_QSTR(MP_QSTR_mymodule) }, { MP_OBJ_NEW_QSTR(MP_QSTR_magic_number), MP_OBJ_NEW_SMALL_INT(10) }, { MP_OBJ_NEW_QSTR(MP_QSTR_conditional_add_one), (mp_obj_t)&conditional_add_one_obj }, { MP_OBJ_NEW_QSTR(MP_QSTR_conditional_add_one), (mp_obj_t)&mymodule_helloObj_type }, };
ãã¹ãïŒ
>>> mymodule.helloObj <type 'helloObj'>
çµæã®åã¯ç¶æ¿ãæ¯èŒã§ããŸãããã³ã³ã¹ãã©ã¯ã¿ãŒãŸãã¯é¢é£ããŒã¿ã¯ãããŸããã ããŒã¿ã¯ã³ã³ã¹ãã©ã¯ã¿ã®ãé£ã«ã远å ãããŸããPythonã¿ã€ããåå¥ã«æ ŒçŽãããåå¥ã®æ§é ïŒä»»æã®ããŒã¿ã»ããïŒãäœæããããšãææ¡ãããŠããŸãã
// -. , typedef struct _mymodule_hello_obj_t { // mp_obj_base_t base; // - uint8_t hello_number; } mymodule_hello_obj_t;
ãã®ããŒã¿ãšããåãããæ¹æ³ã¯ïŒ æãé£ããæ¹æ³ã®1ã€ã¯ãã³ã³ã¹ãã©ã¯ã¿ãŒã䜿çšããããšã§ãã
// -, (, , mymodule_helloObj_type // , - ), (args kwargs) // : args, kwargs STATIC mp_obj_t mymodule_hello_make_new( const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args ) { // mp_arg_check_num(n_args, n_kw, 1, 1, true); // mymodule_hello_obj_t *self = m_new_obj(mymodule_hello_obj_t); // self->base.type = &mymodule_hello_type; // self->hello_number = mp_obj_get_int(args[0]) // return MP_OBJ_FROM_PTR(self); // __init__, , } // make_new const mp_obj_type_t mymodule_helloObj_type = { { &mp_type_type }, .name = MP_QSTR_helloObj, .locals_dict = (mp_obj_dict_t*)&mymodule_hello_locals_dict, // .make_new = mymodule_hello_make_new, };
ä»ã®ãã£ãŒã«ãã®ãã¡ã .print
ããã.print
ãæ®ãã®éæ³ã¯Python3
ã§ãã
ãã ãããªããžã§ã¯ãã®ã€ã³ã¹ã¿ã³ã¹ãååŸããããã«make_new
ã¯å¿
èŠãããŸãããåæåã¯ä»»æã®é¢æ°ã§å®è¡ã§ããŸãã micropython/ports/esp32/modsocket.c
è¯ãäŸã次ã«ç€ºãmicropython/ports/esp32/modsocket.c
ã
// : STATIC mp_obj_t get_socket(size_t n_args, const mp_obj_t *args) { socket_obj_t *sock = m_new_obj_with_finaliser(socket_obj_t); sock->base.type = &socket_type; sock->domain = AF_INET; sock->type = SOCK_STREAM; sock->proto = 0; sock->peer_closed = false; if (n_args > 0) { sock->domain = mp_obj_get_int(args[0]); if (n_args > 1) { sock->type = mp_obj_get_int(args[1]); if (n_args > 2) { sock->proto = mp_obj_get_int(args[2]); } } } sock->fd = lwip_socket(sock->domain, sock->type, sock->proto); if (sock->fd < 0) { exception_from_errno(errno); } _socket_settimeout(sock, UINT64_MAX); return MP_OBJ_FROM_PTR(sock); } // 0-3 STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(get_socket_obj, 0, 3, get_socket);
ãã€ã³ããããã¡ãœãã
次ã®ã¹ãããã¯ããã€ã³ããããã¡ãœããã远å ããããšã§ãã ãã ããããã¯ä»ã®ãã¹ãŠã®æ¹æ³ãšå€§å·®ãããŸããã ããã¥ã¡ã³ãã®äŸã«æ»ããŸãã
// : 1 (self) STATIC mp_obj_t mymodule_hello_increment(mp_obj_t self_in) { mymodule_hello_obj_t *self = MP_OBJ_TO_PTR(self_in); self->hello_number += 1; return mp_const_none; } // MP_DEFINE_CONST_FUN_OBJ_1(mymodule_hello_increment_obj, mymodule_hello_increment); // 'inc' STATIC const mp_map_elem_t mymodule_hello_locals_dict_table[] = { { MP_OBJ_NEW_QSTR(MP_QSTR_inc), (mp_obj_t)&mymodule_hello_increment_obj }, }
ããã ãã§ãïŒ
>>> x = mymodule.helloObj(12) >>> x.inc()
ãã®ä»ã®ãã¹ãŠã®å±æ§ïŒ getattr ã setattr
@property
ãšäžè¬çã«ããªãèªèº«ã®__getattr__
ã䜿çšããŠãé颿°ã远å ããã®ã¯ã©ãã§ããïŒ ãé¡ãïŒããã¯mymodule_hello_locals_dict_table
æåã§ãã€ãã¹ããŠè¡ãããŸãã
// ... STATIC void mymodule_hello_attr(mp_obj_t self_in, qstr attr, mp_obj_t *dest) { mymodule_hello_obj_t *self = MP_OBJ_TO_PTR(self_in); if (dest[0] != MP_OBJ_NULL) { // __setattr__ if (attr == MP_QSTR_val) { self->val = dest[1]; dest[0] = MP_OBJ_NULL; } } else { // __getattr__ if (attr == MP_QSTR_val) { dest[0] = self->val; } } } // ... attr const mp_obj_type_t mymodule_helloObj_type = { { &mp_type_type }, .name = MP_QSTR_helloObj, // //.locals_dict = (mp_obj_dict_t*)&mymodule_hello_locals_dict, .make_new = mymodule_hello_make_new, // - attr .attr = mymodule_hello_attr, };
ããªãã¯ãäœããçã
ããç°¡æœãªå±æ§ã§ãããšå€æããŸããã ãããã®mp_raise_AttributeError
ã¯ãã¹ãŠã©ãã«ãããŸãmp_raise_AttributeError
ïŒ æ³š ïŒãã®ãããªé¢æ°ã¯ååšããŸããïŒïŒ å®éã AttributeError
ãèªåçã«åŒã³åºãããŸãã ç§å¯ã¯ã dest
ã2ã€ã®èŠçŽ ã®é
åã§ããããšã§ãã æåã®èŠçŽ ã®æå³ã¯ãåºåããæžã蟌ã¿å°çšã§ããå€ãMP_OBJ_SENTINEL
å¿
èŠãããå Žåã¯å€MP_OBJ_NULL
ããèªã¿åãå¿
èŠãããå Žåã¯MP_OBJ_NULL
ãŸãã ãããã£ãŠã颿°ã®çµäºæã«ãæåã®ã±ãŒã¹ã§ã¯mp_obj_t
ãã2çªç®ã®ã±ãŒã¹ã§ã¯MP_OBJ_NULL
ãæåŸ
ãããŸãã 2çªç®ã®èŠçŽ ã¯å
¥åãèªã¿åãå°çšã§ããå€ãæžã蟌ãå¿
èŠãããå Žåã¯æžã蟌ãããã«ãªããžã§ã¯ãã®å€ãåãåããèªã¿åãå¿
èŠãããå Žåã¯MP_OBJ_NULL
ãŸãã 倿Žããå¿
èŠã¯ãããŸããã
以äžã§ç¢ºèªã§ããŸãïŒ
>>> x = mymodule.helloObj(12) >>> x.val = 3 >>> x.val 3
æãè峿·±ãã®ã¯ãREPLã®ã¿ãè£å®ãåŒãç¶ãæ©èœãã .val
ãæäŸãã.val
ã§ãã æ£çŽã«èšããšãç§ã¯Cã®å°éå®¶ã§ã¯ãªãã®ã§ããããã©ã®ããã«èµ·ãããæšæž¬ããããšããã§ããŸããïŒæŒç®åã==ããåå®çŸ©ããããšã«ãã£ãŠïŒã
枯
A9Gã¢ãžã¥ãŒã«ã«æ»ã£ãŠãSMSãGPRSïŒusocketsïŒãGPSã黿ºç®¡çãªã©ããã¹ãŠã®åºæ¬æ©èœã®ãµããŒãã«ã€ããŠèª¬æããŸãã ã ããã§ããã®ãããªãã®ãã¢ãžã¥ãŒã«ã«ã¢ããããŒãããããšãã§ããåäœããŸãïŒ
import cellular as c import usocket as sock import time import gps import machine # print("Waiting network registration ...") while not c.is_network_registered(): time.sleep(1) time.sleep(2) # GPRS print("Activating ...") c.gprs_activate("internet", "", "") print("Local IP:", sock.get_local_ip()) # GPS gps.on() # thingspeak host = "api.thingspeak.com" api_key = "some-api-key" fields = ('latitude', 'longitude', 'battery', 'sat_visible', 'sat_tracked') # , ! fields = dict(zip(fields, map(lambda x: "field{}".format(x+1), range(len(fields))) )) x, y = gps.get_location() level = machine.get_input_voltage()[1] sats_vis, sats_tracked = gps.get_satellites() s = sock.socket() print("Connecting ...") s.connect((host, 80)) print("Sending ...") # , HTTP. HTTP, SSL print("Sent:", s.send("GET /update?api_key={}&{latitude}={:f}&{longitude}={:f}&{battery}={:f}&{sat_visible}={:d}&{sat_tracked}={:d} HTTP/1.1\r\nHost: {}\r\nConnection: close\r\n\r\n".format( api_key, x, y, level, sats_vis, sats_tracked, host, **fields ))) print("Receiving ...") print("Received:", s.recv(128)) s.close()
ãããžã§ã¯ãã¯ãå®è¡å¯èœãªãã«ããæè¿ããŸãã ãããžã§ã¯ãããã®èšäºãæ°ã«å ¥ã£ãããgithubã«ãããïŒãæ®ãããšãå¿ããªãã§ãã ããã