èæ¯
èªå® ã§å ãšæ°åã®å¶åŸ¡ãèªååããã ãã§ãªããç¬èªã®ãããããäœæããããšèããŸããã ãã®ç®çã®ããã«ãå©çšå¯èœãªæ©äŒã暡玢ãå§ããŸããã ç§èªèº«ã¯ããã¹ãŠã®æ±ºå®ã2ã€ã®ã°ã«ãŒãã«åããŸãããã³ã³ãããŒã©ãŒäžã®ã³ãŒãã1ã€ã®ã¡ã€ã³ã«ãŒãïŒarduinoãlegoãªã©ïŒã§å®è¡ãããã·ã¹ãã ãšãã¡ãã»ãŒãžã亀æãã䞊åããã»ã¹ã§æ§æãããã·ã¹ãã ã§ãã
䜿ãããããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ãåããæãåçŽãªãœãªã¥ãŒã·ã§ã³ãèŠã€ããããšæã£ããããçŽæçã«2çªç®ã®ã°ã«ãŒããéžæããŸããã ãã®ã家æãã®æã人æ°ã®ãã代衚è ã®ãã¡ãç§ã¯Microsoft Robotics StudioãšROSãæ¬åœã«å¥œãã§ããã ããããæ®å¿µãªãããçŸæç¹ã§ã¯ãããããç¹å®ã®ããŒããŠã§ã¢ã«ãªã³ã¯ããããšã¯ç°¡åã§ã¯ãªãããããããŒãããç解ããããšãç°¡åãªäœæ¥ã§ã¯ãããŸããã ãã®çµæãç§ã¯èªåã§ãããæžãããšã«ããŸããããç§ã¯æ¬åœã«Cã§ãã³ãŒãã£ã³ã°ãããããããŸããã§ããããœãŠã«ã¯ãã£ãšç°¡åã§ç°¡åãªãã®ãæ±ããŸããã æåŸã«ãç§ã¯PythonãéžæããŸããã ãããŠãä»ã®å€ãã®ã¢ã€ãã¢ããããããšãã¹ããŒãããŒã ããè¶ããŠé ã«ç»ãå§ããããšãèæ ®ããŠãç§ã¯ããã«éçºã®å®¹æãã«äž»ãªéç¹ã眮ãå°ããªãã¬ãŒã ã¯ãŒã¯ãäœæããããšã«ããŸããã
ã³ã³ã»ãã
æŠå¿µçã«ã¯ããã¬ãŒã ã¯ãŒã¯ã¯ãããŸããŸãªããããæ©èœãå®è£ ãããŠãŒã¶ãŒããµããŒãããã¢ãžã¥ãŒã«ã®ã»ããã§ãã åäœäžãBubotã¯äºãã«éåæã«ã¡ãã»ãŒãžãéåä¿¡ã§ããããã»ã¹ã®ãããã¯ãŒã¯ãæ§ç¯ããŸãã ãŸããäºãã«éä¿¡ããããããã®ãããã¯ãŒã¯ãæ§ç¯ããããšãã§ããŸãã

ããã»ã¹ãããã¯ãŒã¯ã¯ãæšæºã®Pythonãã«ãããã»ãã·ã³ã°ã¢ãžã¥ãŒã«ã«åºã¥ããŠæ§ç¯ãããŠããŸãã ã¡ãã»ãŒãžã³ã°ã·ã¹ãã ãšå ±æã¡ã¢ãªã¯ã Redisã䜿çšããŠå®è£ ãããŸãã
åBubotã«ã¯WebãµãŒããŒã Tornado WebãµãŒããŒãçµã¿èŸŒãŸããŠããŸããããã«ããã移åäžã®ããããã®ã¹ããŒã¿ã¹ã®ç£èŠãããããã®å¶åŸ¡ããã©ã¡ãŒã¿ãŒã®å€æŽïŒãã£ãªãã¬ãŒã·ã§ã³ïŒãå¯èœã«ãªããŸãã
Bubotã¯ãªã¢ã«ã¿ã€ã ã·ã¹ãã ã§ã¯ãããŸããããBubotã¯ãªã¢ã«ã¿ã€ã ã³ãŒããšçµ±åã§ããŸãã
ãããŒããã«
äœãæ°ããããšãåŠã¶ããšã¯ãäŸã«ãã£ãŠåžžã«ç°¡åã«ãªããŸããæåã«é ã«æµ®ãã¶ã®ã¯ãWi-FiãŸãã¯3Gãä»ããŠWebã€ã³ã¿ãŒãã§ãŒã¹ã䜿çšããŠãå¶åŸ¡ã®ããã«ç¡ç·æ瞊ç©å ·ãäœãçŽãããšã§ãã
ãããè¡ãã«ã¯ãäžåœã®ã©ãžã³ã³æ©ãšPython 3ãå®è¡ã§ããããã³ã³ãã¥ãŒã¿ãŒãå¿ èŠã§ããæãæé ãªãŠãµã®ã®1ã€ãã¢ã«ã¢ãããšããŠè³Œå ¥ãããŸãã-raspberry pi b +ã
æåã¯ãã»ãšãã©ãã¹ãŠã®ã©ãžã³ã³ãã·ã³ã¯2ã€ã®ã¢ãŒã¿ãŒãš1ã€ã®åå§çãªç¡ç·ã¢ãžã¥ãŒã«ã§ãã ãã·ã³èªäœããã¹ãŠã®é»åæ©åšãå容ããã®ã«é©ãããµã€ãºã«ãªãããã«ãã¢ãŒã¿ãŒã®ã¿ãå¿ èŠã§ãã
éå§ããã«ã¯ãã¿ã¹ã¯ãåçŽåããŸãããã·ã³ã¯4ã€ã®ã¢ã¯ã·ã§ã³ãå®è¡ããå¿ èŠããããŸããåé²ãŸãã¯åŸéãå·ŠãŸãã¯å³ã«æ²ãããŸãã
åé¡ã解決ããã«ã¯ã次ãå¿ èŠã§ãã
- ã¢ãŒã¿ãŒãã©ãºããªãŒã«æ¥ç¶ãã
- ç¹å®ã®ç©çããã€ã¹ã§ãŠãŒã¶ãŒã³ãã³ããåä¿¡ããŠââ解éãããµãŒãã¹ãå®è£ ãã
- ãŠãŒã¶ãŒã³ãã³ããéä¿¡ããWebã€ã³ã¿ãŒãã§ã€ã¹ãå®è£ ããŸããã¡ã€ã³ãŸãã¯ããŒã¿ãªãŒãšã³ãžã³ã®åºåã-100ïŒ / 0ïŒ / 100ïŒ ã«èšå®ããŸãã
ã¢ãŒã¿ãŒãæ¥ç¶ããŸã
ã¢ãŒã¿ãŒãRaspberry Piã«æ¥ç¶ããæãç°¡åãªæ¹æ³ã¯ãæ¢æã®ã³ã³ãããŒã©ãŒã䜿çšããããšã§ããã³ã³ãããŒã©ãŒã®éžæã¯ãã¢ãŒã¿ãŒã®æšå®é»åã®ã¿ã«äŸåããŸãã L298Nã«åºã¥ããŠããŒãžã³ãéžæããŸããã aliexpressãL298Nã¢ãŒã¿ãŒãã©ã€ããŒããŒããã®æ€çŽ¢æååã«ã¯ãé éã«çŽ3ãã«ããããŸãã

ãŸããã©ãºããªãŒã«é»åãäŸçµŠããã«ã¯ãå°ãªããšã1ã€ã®éå§é»å§ã³ã³ããŒã¿ãå¿ èŠã§ãã ç§ã¯LM2596ã«åºã¥ããŠæ®åœ±ããŸããã aliexpressã®æ€çŽ¢æååãDC-DC LM2596ãã§ã¯ãéæãçŽ1ãã«ããããŸãã
ãã®æ¥ç¶ã«ããããã·ã³ã«ã³ãã³ãã®1ã€ãå®è¡ãããã«ã¯ã察å¿ããGPIOã§é«ã¬ãã«ãèšå®ããã ãã§ååã§ãã
ã¢ãŒã¿ãŒã¢ãžã¥ãŒã«ãå®çŸ
ã¢ãã«ãç°¡çŽ åããããã«ãç§ãã¡ã®ããŒã ãã¢ãŒã¿ãŒã«çŽæ¥ã¢ã¯ã»ã¹ã§ããããã«ããŸãã
2ã€ã®åäžã®ïŒãœãããŠã§ã¢ã®èŠ³ç¹ããïŒã¢ãŒã¿ãŒãããããã1ã€ã®ã¢ãžã¥ãŒã«ãå¿ èŠã§ãã ãã¹ãŠã®ã¢ãžã¥ãŒã«ã¯ãBujectåºæ¬ã¯ã©ã¹ãŸãã¯ãã®åå«ããç¶æ¿ãããŸãã éçºè ã¯ãåºæ¬ã¯ã©ã¹ãããã¡ã€ã³ã®ç¡éã«ãŒããã€ãã³ããåŠçããŠæž¡ãããã®ã¡ãœãããåãåããŸãã ãã¬ãŒã ã¯ãŒã¯ã®ã¢ãžã¥ãŒã«ã¯ãbujectãã£ã¬ã¯ããªã«ãããŸãã åã¢ãžã¥ãŒã«ã¯2ã€ã®ãã¡ã€ã«ã§æ§æãããŸãã
- [ã¢ãžã¥ãŒã«å] .py-ã¢ãžã¥ãŒã«ããžãã¯
- [ã¢ãžã¥ãŒã«å] .json-ã¢ãžã¥ãŒã«ã®èª¬æã ããã«ã¯ãã¢ãžã¥ãŒã«ãã©ã¡ãŒã¿ã®ãªã¹ãããããã®ããã©ã«ãå€ãå¯èœãªã¹ããŒã¿ã¹ã®ãªã¹ããã¢ãžã¥ãŒã«ã«ãã£ãŠçæãããã¡ãã»ãŒãžã®èª¬æãããã³ã¢ãžã¥ãŒã«ããµãã¹ã¯ã©ã€ããããã¡ãã»ãŒãžã®ãªã¹ããå«ãŸããŸãã
ã¢ãŒã¿ãŒ\ buject \ MotorTest.pyã®ãµã³ãã«ã¢ãžã¥ãŒã«ïŒ
import json from buject.Buject import Buject import RPi.GPIO as GPIO class MotorTest(Buject): # def __init__(self, user_config=None): super(MotorTest, self).__init__(user_config) # # GPIO def on_ready(self): GPIO.setmode(self.param["mode"]) GPIO.setwarnings(False) # , # # # set_power def incoming_request_set_power(self, message): data = json.loads(message['data']) if data['param']['value'] > 0: # GPIO.setup(self.param['GPIO_reward'], GPIO.OUT, 0) GPIO.setup(self.param['GPIO_forward'], GPIO.OUT, 1) self.status['action'] = "forward" elif data['param']['value'] == 0: GPIO.setup(self.param['GPIO_forward'], GPIO.OUT, 0) GPIO.setup(self.param['GPIO_reward'], GPIO.OUT, 0) self.status['action'] = "stopped" else: GPIO.setup(self.param['GPIO_forward'], GPIO.OUT, 0) GPIO.setup(self.param['GPIO_reward'], GPIO.OUT, 1) self.status['action'] = "backward {0}%".format(self.status["power"]) # , if self.param['debug'] > 1: self.log('Buject "{0}" {1}'.format(self.param['name'], self.status['action']))
ã³ã¡ã³ãã¯äžèŠã ãšæããŸãã ã¢ãŒã¿ãŒåºåã瀺ãããŠãããã©ã¡ãŒã¿ãŒã§èŠæ±ãå°çããããããŒããã倧ããå Žåãã¢ãŒã¿ãŒã«åé²ããããæ瀺ããŸãã
ãã®å Žåã®ç¡éã®ãµã€ã¯ã«ã¯é¢ä¿ããŠããŸããã§ããã ããå Žåã¯ãmain_loopïŒïŒã¡ãœãããå®çŸ©ããã ãã§ååã§ãã
\ buject \ Motor.jsonã¢ãŒã¿ãŒã®ã¢ãžã¥ãŒã«èšè¿°ã®äŸïŒ
{ "param": { "name": { "value": "MotorTest", "description": " " }, "parent": { "value": "Buject", "description": " , " }, "buject": { "value": "MotorTest", "description": " = " }, "GPIO_forward": { "value": 0, "description": " GPIO " }, "GPIO_backward": { "value": 0, "description": " GPIO " }, "GPIO_mode": { "value": 11, "description": "value for GPIO.setmode GPIO.BOARD=10 GPIO.BCM=11" } }, "incoming_request": { "set_power": { "name": "set_power", "description": " ", "param": { "value": { "description": " ", "type": "int" } } } } }
paramã»ã¯ã·ã§ã³ã«ã¯ãã¢ãžã¥ãŒã«ã®èµ·åãšæäœã«å¿ èŠãªãã©ã¡ãŒã¿ãŒã®ãªã¹ããå«ãŸããŠããŸãã æåã®3ã€ã¯åã¢ãžã¥ãŒã«ã«å¿ èŠã§ãããBujectåºæ¬ã¯ã©ã¹ããç¶æ¿ããŸãã åŸè ã¯ãã®ã¢ãžã¥ãŒã«ã®ã¿ã«åºæã®ãã®ã§ãããå¿ èŠã«å¿ããŠçªå·ãšååãèªåã§æãã€ããŸãã GPIO_modeã¯GPIOã¢ãã¬ãã·ã³ã°ã¢ãŒããèšå®ããå°æ¥åå®çŸ©ãããŸããã GPIO_forwardããã³GPIO_backwardã®å Žåãããã©ã«ãå€ãèšå®ããããšã¯æå³ããããŸããã ç¹å®ã®ã¢ãŒã¿ãŒãã©ã®çµè«ã«æ¥ç¶ããããã«ã®ã¿äŸåãããã®ã¢ãžã¥ãŒã«ã®èµ·åãã©ã¡ãŒã¿ãŒã§ããã«å®çŸ©ããŸãã
ãŸããã¢ãžã¥ãŒã«ã®èª¬æã«ã¯ãã¢ãžã¥ãŒã«ã®çŸåšã®ç¶æ ãåæ ããã¹ããŒã¿ã¹ã»ã¯ã·ã§ã³ïŒèšç®ããããã¹ãŠã®ãã©ã¡ãŒã¿ãŒã説æãããŠããïŒãå«ãŸããŠããå ŽåããããŸãã ã¢ãžã¥ãŒã«ã«è¿œå ãããã¹ããŒã¿ã¹ã¯ãããŸããããæ°ã¥ããå Žåãã¢ãžã¥ãŒã«èªäœã®ã³ãŒãã§ãã¢ã¯ã·ã§ã³ãã®ã¹ããŒã¿ã¹ãå€æŽããŸããããã¯ããŒã¹Bujectã¢ãžã¥ãŒã«ã®èª¬æã§å®çŸ©ãããŠããŸãã
ãã®ãã¬ãŒã ã¯ãŒã¯ã¯ã5çš®é¡ã®ã¡ãã»ãŒãžã䜿çšããæ©èœãæäŸããŸã
- incoming_request-ã¢ãžã¥ãŒã«ãåŠçã§ãããªã¯ãšã¹ãã®ãªã¹ãã
- outgoing_request-ã¢ãžã¥ãŒã«ã«ãã£ãŠçæããããªã¯ãšã¹ãã®ãªã¹ãã ãã©ã¡ãŒã¿ãŒã¯ããªã¯ãšã¹ããåä¿¡ãããµãŒãã¹ã®ååãšãªã¯ãšã¹ãã®ååãæå®ããå¿ èŠããããŸãã
- incoming_event-ä»ã®ã¢ãžã¥ãŒã«ã®ã€ãã³ããžã®ãµãã¹ã¯ãªãã·ã§ã³ã®ãªã¹ãããµãŒãã¹åãšã€ãã³ãåãå¿ ãæå®ããŠãã ããã
- outgoing_event-ä»ã®ã¢ãžã¥ãŒã«ããµãã¹ã¯ã©ã€ãã§ããã€ãã³ãã®ãªã¹ãã
- incoming_responseã¯ãçºä¿¡èŠæ±ã§å®£èšããããµãŒãã¹ã¿ã€ãã§ãã ãµãŒãã¹ã¯èŠæ±ã«å¯Ÿããéåæå¿çãåŸ ã€ãšèšããŸãã
Webã€ã³ã¿ãŒãã§ãŒã¹ãå®è£ ããŸã
åããããã¯ãç¡å¶éã®æ°ã®Webã€ã³ã¿ãŒãã§ãŒã¹ãæã€ããšãã§ããŸãã ç§ãã¡ã®å Žåããããããå¶åŸ¡ããããã«ããã£ã1ã€ã§ååã§ãã4ã€ã®ãã¿ã³ãå®è£ ããæŒããããšã³ãã³ããçºè¡ããæŒããããšãã£ã³ã»ã«ããŸãã
ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã¯uiãã£ã¬ã¯ããªã«æ ŒçŽãããŸãã ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã®åããŒãžã¯åå¥ã®ãµããã£ã¬ã¯ããªã§èª¬æãããå°ãªããšã2ã€ã®ãã¡ã€ã«ã§æ§æãããŸãã
- [ããŒãžå] .html-ããŒãžã¬ã€ã¢ãŠãã
- [ããŒãžå] .json-ã€ã³ã¿ãŒãã§ãŒã¹ã®èª¬æã ãã¬ãŒã ã¯ãŒã¯ã®åããŒãžïŒã»ãã·ã§ã³ïŒã¯åºæ¬çã«åå¥ã®ãµãŒãã¹ã§ãããã®ãã¡ã€ã«ã«ã¯ããã®ããŒãžããµãã¹ã¯ã©ã€ãããã€ãã³ãã®èª¬æãšãçæãããã¡ãã»ãŒãžãå«ãŸããŸãã
- [ããŒãžå] .py-ïŒãªãã·ã§ã³ïŒãã®ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã®ã³ãã³ããåŠçããããã®ãµãŒããŒããžãã¯ãå«ããããšãã§ããŸããããã®å Žåã¯åœ¹ã«ç«ã¡ãŸããã
ç¹°ãè¿ããŸãããç¥èŠãæ¹åããããã«ãããå°ãç°¡åã«ããŸãããã 以äžã®äŸã§ã¯ãã¯ã³ãã¿ã³ãã©ã¯ãŒãã¢ã«ãŽãªãºã ãæ€èšããŸãã æ®ãã¯é¡æšã«ãã£ãŠè¡ãããšãã§ããŸãã
ãã®ãããuiãã£ã¬ã¯ããªã«scout_easyãµããã£ã¬ã¯ããªãäœæãããã®äžã«æ¬¡ã®å 容ãæã€2ã€ã®scout_easy.htmlããã³scout_easy.jsonãã¡ã€ã«ïŒããã¹ãã«é¢ããã³ã¡ã³ãïŒãäœæããŸãã
\ ui \ scout_easy \ scout_easy.html
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <link rel="stylesheet" href="/static/jquery-ui-1.11.2/jquery-ui.css"> <script type="text/javascript" src="/static/jquery-2.1.3.min.js"></script> <script type="text/javascript" src="/static/jquery-ui-1.11.2/jquery-ui.js"></script> <script type="text/javascript" src="/static/bubot_socket.js"></script> <title>BuBot</title> <script> function bubot_on_open() { // , // WebSocketa // , ui/studio ui/scout--> } function get_bubot_actions() { // , , // . // ui/studio ui/scout--> return {}; } $(function () { // $("#command_move_forward").button({}).mousedown(function () { // , // 100% // 0%--> bubot_send_message('send_request', {'name': "set_move_motor_power", 'data': {'value': 100}}); }).mouseup(function () { bubot_send_message('send_request', {'name': "set_move_motor_power", 'data': {'value': 0}}); }); }) </script> </head> <body class="ui-widget-content"> <button id="command_move_forward" class="command_button">forward</button> <div id="console" class="ui-widget-content"></div> </body> </html>
div id = consoleãååšããå Žåããã¬ãŒã ã¯ãŒã¯ã¯ããã«å«ãŸãããã¹ãŠã®ã³ã³ãœãŒã«ã¡ãã»ãŒãžãåºåããŸãã ãµãŒããŒåŽã®ã³ãŒããšã©ãŒã
bubot_socket.js-ãã¹ãŠã®UIããŒãžã«ååšããå¿ èŠããããŸãããµãŒããŒãšã¡ãã»ãŒãžã³ã°ãžã®æ¥ç¶ã確ç«ããã®ã¯åœŒã§ããããã§ãã
ãµãŒããŒãžã®æ¥ç¶ã¯Webãœã±ãããä»ããŠè¡ãããbubot_send_messageã¡ãœããïŒ[ã¡ãã»ãŒãžå]ã[ã¡ãã»ãŒãžãã©ã¡ãŒã¿ãŒ]ïŒã¯ãµãŒããŒãžã®ã¡ãã»ãŒãžã®éä¿¡ãæ åœããŸãã ãµãŒããŒã§ã¯ãã¡ãã»ãŒãžãå°çãããšãåãååã®ã¡ãœãããåŒã³åºãããããã«ã¡ãã»ãŒãžãã©ã¡ãŒã¿ãŒãéä¿¡ãããŸãã ãã®å Žåãset_move_motor_powerãªã¯ãšã¹ããéä¿¡ããã¡ãœãããåŒã³åºããããã¬ãŒã ã¯ãŒã¯ã¯ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹èšè¿°ãã¡ã€ã«ããã¡ãã»ãŒãžåä¿¡è ã®ååãååŸããŸãããããã®ãµãŒãã¹ã®ååã¯ãããããã説æããæåŸã®ã»ã¯ã·ã§ã³ã§æ±ºå®ãããŸãã
\ ui \ scout_easy \ scout_easy.json
{ "incoming_request": { "console": { "time": {}, "message": {} } }, "outgoing_request": { "set_move_motor_power": { "name": "set_power", "buject": "move_motor", "description": " ", "param": { "value": { "description": " , > 0, < 0", "type": "int" } } }, "set_rotate_motor_power": { "name": "set_power", "buject": "rotate_motor", "description": " ", "param": { "value": { "description": " , > 0, < 0", "type": "int" } } } } }
ãããããèµ·åããŸã
ãã®ãããããããã®ãã¹ãŠã®éšåãæºåããŸããã å®è¡ããã«ã¯ãããããèªäœã®èª¬æãå«ãå¥ã®ãã¡ã€ã«ãå¿ èŠã§ãã
configãã£ã¬ã¯ããªã«ã¯ããã¹ãŠã®ããããã®èª¬æãå«ãŸããŠããŸãã æåã§ããŸãã¯ã³ã³ãã£ã®ã¥ã¬ãŒã¿ãŒã®å©ããåããŠèª¬æãäœæã§ããŸããã詳现ã¯bubotïŒscoutã«é¢ãããããªã§èª¬æããŸãã
ãããã£ãŠãæåã®ããããã®å Žåã説æã¯æ¬¡ã®ããã«ãªããŸãã
\ config \ scout_easy.json
{ "param": { "name": { "value": "scout_easy" } }, "depend_buject": { # "move_motor": { # , , "param": { "buject": { # "value": "MotorTest" }, "name": { # "value": "move_motor" }, "GPIO_forward": { # "value": 20 }, "GPIO_reward": { "value": 21 } } }, "rotate_motor": { # "param": { "buject": { "value": "MotorTest" }, "name": { "value": "rotate_motor" }, "GPIO_forward": { "value": 13 }, "GPIO_reward": { "value": 19 } } } } }
ãã®èª¬æã«ãããšãèµ·åæã®Bubotã¯ãç°ãªããã©ã¡ãŒã¿ãŒã§MotorTestã¢ãžã¥ãŒã«ã®2ã€ã®ã€ã³ã¹ã¿ã³ã¹ãäœæããŸãã1ã€ã¯ã¡ã€ã³ã¢ãŒã¿ãŒ-move_motorããã1ã€ã¯ã¹ãã¢ãªã³ã°ã¢ãŒã¿ãŒ-rotate_motorã§ãããã»ã¹ãšããŠéå§ããŸãã ã芧ã®ãšãããGPIOã®ã¢ãã¬ã¹æå®æ¹æ³ã¯æå®ããŠããŸããã ããã©ã«ãå€ã«ã¯æºè¶³ããŠããŸãããã¢ãŒã¿ãŒæ¥ç¶å³ã«åŸã£ãŠGPIO_forwardããã³GPIO_backwardãã©ã¡ãŒã¿ãŒãåå®çŸ©ããŸããã
ããã§ãã¹ãŠã®æºåãæŽããŸããã å®è¡ã§ããŸãã
python3 StartBubot scout_easy
ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹httpïŒ// localhost / ui / scout_easyããã©ãŠã¶ã§éãããã¿ã³ãã¯ãªãã¯ããŠã¿ãŸãã æåã®èµ·åæã«ããŠãŒã¶ãŒåãšãã¹ã¯ãŒãã®å ¥åãæ±ããããŸã-å€ãå ¥åããŸããããã©ã«ãã§ã¯ãã·ã¹ãã ãžã®ã¢ã¯ã»ã¹æš©ã¯èšå®ãããŠããŸããã
ããããã¹ã«ãŠã
ãã·ã³ãããã«éçºããå Žåã次ã®ã¹ãããã¯é§åé床ã®èª¿æŽãã¹ãã¢ãªã³ã°ã¢ãŒã¿ãŒã®ãµãŒããžã®äº€æãã«ã¡ã©ã®åãä»ããã«ã¡ã©ã®ãã©ã€ããé³å£°åæè£ çœ®ãé³å£°ã³ãã³ãã®èªèãªã©ã§ãã ããããããã¯ãŸã£ããç°ãªã話ã§ãã


bubotãããŠã³ããŒããã