「codey rocky」カテゴリーアーカイブ

codey rocky(ESP32)でMicroPythonを動かす(3) – テレビのリモコンでrockyを動かす

ども。こんばんは。

なぜだかわかりませんが思いの外ハマっています。楽しい。

ラズパイに比べてできることに制約が多いので、制約の中でできることを探しながら色々試すのが楽しいですね。

で、今回は、赤外線(Infrared)を使って、テレビのリモコンでrockyを操作するコードを作ってみました。

・Codey
Aボタン:リモコンから受け取ったコードを表示するだけ
Bボタン:全スクリプトを停止
Cボタン:リモコン操作で動くモード

・リモコン
音量大小:速度を変更(1-100)
上下左右:押している間rockyがその方向にすすむ

・おまけ
前に障害物がある場合は、止まる。

動かすとこんな感じです。
音量キーでの速度の調整がやたら早いので少しwaitを入れたいのですが、他のコード受信時と同じ処理でやっているので、waitをかけるとrockyの動きがカクカクになります。。。

 

 

■コード

import codey,rocky,event

#このグローバル変数イマイチ
rspeed = 10

def speedctl(flg):
    global rspeed
    if flg == "up":
        if rspeed < 100: rspeed = rspeed + 5 else: if rspeed > 10:
            rspeed = rspeed - 5


#リモコンモード
# TOSHIBA製リモコン
# 64 26 音量大
# 64 30 音量小
# 64 62 上
# 64 64 下
# 64 95 左
# 64 91 右
@event.button_c_pressed
def button_c_cb():
    global rspeed
    codey.display.show("RC",wait=True)
    while True:
        ope = codey.ir.receive_remote_code()[1]
        codey.display.show(rspeed,wait=True)

        if ope == 26:
            speedctl('up')
        elif ope == 30:
            speedctl('down')

        if ope == 0:
            rocky.stop()
        elif ope == 91:
            rocky.turn_right(rspeed)
        elif ope == 95:
            rocky.turn_left(rspeed)
        elif ope == 62:
            if not rocky.color_ir_sensor.is_obstacle_ahead():
                rocky.forward(rspeed)
            else:
                rocky.stop()
        elif ope == 63:
            rocky.backward(rspeed)
        else:
            rocky.stop()

#ただのリモコン読み取りモード
@event.button_a_pressed
def on_button_a_pressed():
    codey.display.show("Recv mode",wait=True)
    while True:
        ope = str(codey.ir.receive_remote_code()[0])
        ope2 = str(codey.ir.receive_remote_code()[1])
        codey.display.show(ope2,wait=True)

#### TEMPLATE ####
#基本的な構文間違いなどにきづけるように起動時にok!と表示 
@event.start
def on_start():
    codey.display.show("ok!")

#スクリプト停止
@event.button_b_pressed
def on_button_b_pressed():
    codey.display.show("Stopped",wait=True)
    codey.stop_all_scripts()

 

ちなみに、赤外線の送信はまだうまく行ってません・・・。というか、送信機能未完成っぽい?

フォーラムでテクニカルサポートからこんな回答がでてます・・・。

リモコンに信号を送るには2つ送らないと行けないけどまだエミッターができてないよ、的な・・・。

2年経ったけどいかがでしょうか・・・。

Sensing IR signals

I am afraid that currently IR control port on mblock software is not open for users yet, although the firmware supports that. Users now cannot use remote controller to control codey rocky.
We will update the information if we add this function to mblock software officially.
Thank you for the feedback, we’ll complete APIs for IR reception emitter then.
 

【バックナンバー】

ではでは。またの機会に。

codey rocky(ESP32)でMicroPythonを動かす(2) – MQTTでメッセージの送受信

ども。こんばんは。

codey rockyではメッセージキューWとしてMQTTWが実装されています。

せっかくなのでちょっと試してみます。

MQTTについては少し古いですがこの辺がわかりやすいです。

MQTTで始めるIoTデバイスの作り方 第1回:「MQTT」を知り「Mosquitto」を導入する (1/3)

まずはMQTTのブローカーとしてmosquittoをRaspberry Pi上にインストールします。
※そのうちRabbit MQも試したいなと思いますがまずは手軽そうなmosquittoで試します。

ブローカーの動作環境はRaspbian GNU/Linux 9.11 (stretch)で、2020/02/16時点最新のパッケージになっています。

・mosquittoのインストール

sudo apt install mosquitto

うちの環境ではlibev4とlibwebsockets8も合わせてインストールされました。

・続いてクライアントもインストールします。

sudo apt install mosquitto-clients

libmosquitto1が合わせてインストールされました。

・ブローカーの起動

sudo systemctl start mosquitto

sudo systemctl status mosquittoで確認して特に問題なく起動していました。
1883ポートでLISTENしているみたいですね。

・テスト

以下のコマンドでtestというトピックを購読(サブスクライブ)します。

mosquitto_sub -d -t test

実行結果はこんな感じ。
※lexはうちのラズパイのホスト名です。

Client mosqsub/6162-lex sending CONNECT
Client mosqsub/6162-lex received CONNACK
Client mosqsub/6162-lex sending SUBSCRIBE (Mid: 1, Topic: test, QoS: 0)
Client mosqsub/6162-lex received SUBACK
Subscribed (mid: 1): 0

・テストメッセージ送信

別のターミナルでSSHに接続してtestトピックに投稿(publish)します。

mosquitto_pub -d -t test -m “test 1”

すると、サブスクライバー側で以下のように表示されます。

Client mosqsub/6162-lex received PUBLISH (d0, q0, r0, m0, ‘test’, … (6 bytes))

test 1

これで最低限の動作はokですね。

続いてcodey側にこんなコードをアップしてみました。
以下のリファレンスからサンプルコードを流用していますが、リファレンス内のサンプルコードの「from mqtt import MQTTClient」は誤りで、正しくは「from cloud_message.mqtt import MQTTClient 」です。

https://makeblock-micropython-api.readthedocs.io/en/latest/public_library/Third-party-libraries/mqtt.html

■サンプルコード

#import mqtt package
#リファレンスは"from mqtt import MQTTClient"となっているが実際はcloud.message.mqttが正しい
#https://forum.makeblock.com/t/importerror-no-module-named-mqtt/15029
from cloud_message.mqtt import MQTTClient

import codey, time, event
import utime

MQTTHOST = "mosquittoのサーバのIPアドレス"
MQTTPORT = 1883

#なんでもいいらしいが重複はだめっぽい。
#https://qiita.com/egnr-in-6matroom/items/3aef4bd45857e75bb1d3
client_id = "101"

# Example Path
#ここの指定方法がまだわからない・・・。全部取得してみる。
Topic = "#"

# ID / PWはオプション。今回はmosquitto側では指定していないので省略した。
#mqttClient = MQTTClient(client_id, MQTTHOST, port=MQTTPORT, user='test', password='test', keepalive=0, ssl=False)
mqttClient = MQTTClient(client_id, MQTTHOST, port=MQTTPORT, keepalive=0, ssl=False)

# Connect to the MQTT server
def on_mqtt_connect():
    mqttClient.connect()

# publish a message
def on_publish(topic, payload, retain=False, qos = 0):
    mqttClient.publish(topic, payload, retain, qos)

# message processing function
def on_message_come(topic, msg):
    #print(topic + " " + ":" + str(msg))
    #b'test'みたいな表示になるので、文字列化して分割。なおメッセージ自体に'(シングルクォーテーション)がある場合は""で囲まれるが未対応
    temp_msg = str(msg).split("'")[1]
    codey.display.show(temp_msg,wait=True)

# subscribe message
def on_subscribe():
    mqttClient.set_callback(on_message_come)
    mqttClient.subscribe(Topic, qos = 1)

@event.button_a_pressed
def on_button_a_pressed():
    codey.display.show("Start",wait=True)
    codey.wifi.start('SSID', 'パスワード', codey.wifi.STA)
    time.sleep(1)
    if codey.wifi.is_connected():
        codey.emotion.smile()
        on_mqtt_connect()
        on_subscribe()
        codey.display.show("Ready!",wait=True)
        while True:
            #RTCがついてないので起動からの時間となる。
            #nowtime = utime.time()
            #codey.display.show(nowtime,wait=True)
            #codey.display.show(codey.battery.get_percentage(),wait=True)
            # Blocking wait for message
            mqttClient.wait_msg()
            #ブロッキングしない方
            #mqttClient.check_msg()
            time.sleep(1)

    else:
        codey.emotion.shiver()


@event.button_b_pressed
def on_button_b_pressed():
    codey.display.show("Stopped",wait=True)
    codey.stop_all_scripts()

これをcodeyにアップロードすると、パブリッシュされたメッセージを表示するようになります。

だいぶ前に作ったbrouteから消費電力を取得するスクリプトを少し改変して、取得した結果を単純にmosquitto_pub -d -t test -m 値で投稿(publish)するようにしました。
#python上からosコマンドを実行しています。こういう移植性のないことしちゃだめですね。ちゃんとmqttをpythonから操作するように変更しないと・・・

動作の様子はこんな感じです。
エアコンを入れると消費電力がちゃんと上がってますね。

 

本当はメッセージが無い間は、時計にでもしようと思ったのですが、odey rockyにはRTCが搭載されていないようで、utime.time()で取得した値は、電源投入後からの起動時間(秒)となります。

mqttClient.wait_msg()はブロックされますが、mqttClient.check_msg() はブロックされないので、まぁバッテリーの残量を出すとかそういう感じのことはできそうですね。

あと、MQTTのトピックの指定の仕方がよくわかりませんでしたので”#”としています。一応トピックは「test」で来てるみたいですが、「/test/」とかにしてもうまく拾えないんですよね。
これはもうちょっと調べないと。

次は赤外線周りをなんかやってみようかな。

【バックナンバー】

ではでは。またの機会に。

codey rocky(ESP32)でMicroPythonを動かす(1)

ども。こんばんは。

先日購入したcodey rockyが思いの外色々できそうだったので、書いてみることにしました。

codey rockyの開封記事:STEM教育用のおもちゃ「codey rocky」を買ってみた

で、前回の記事でも書きましたが、このcodey rockyにはESP32という制御基板が搭載されており、MicroPythonというPythnoの実装系で動作させることができるようです。

参考になるリファレンスなど:
codey rockyの開発元であるMakeBlock社のPython APIリファレンス
https://makeblock-micropython-api.readthedocs.io/en/latest/

MicroPythonのリファレンス
https://micropython-docs-ja.readthedocs.io/ja/latest/index.html#

さて、とりあえずPythonで色々動かす前に動作確認というか、本当にMicroPython動くんだよね?的な意味も込めてこんなコードをmBlockから流してみました。
※mBlockの使い方の簡単な紹介は前回の記事で。

なお、Codeyのファームウェアは「23.01.013」です。(mBlock上で確認)

import codey, time, event
import uos

@event.button_a_pressed
def on_button_a_pressed():    
    codey.display.show('sysname:' + uos.uname().sysname, wait=True)
    #codey.display.show('nodename:' + uos.uname().nodename, wait=True) same as sysname
    codey.display.show('version:' + uos.uname().version, wait=True)
    codey.display.show('release:' + uos.uname().release, wait=True)
    codey.display.show('machine:' + uos.uname().machine, wait=True)

これをcodeyへアップロードして実行すると、codeyのLCDに以下の文字列が表示されます。
※手書きで写したので間違ってるかも・・。

sysname:esp32
version:23_01_007_004-ht3-21-g28f29e21-dirty on 2019-12-03
release:0.0.0
machine:ESP32 module wth ESP32

なるほど。わからん。けどまぁMicroPythonは動く模様。(“u”から始まるパッケージはMicroPython用らしい)

続いて、ネットワークを使ったプログラムを動作させてみます。
WiFiへの接続部分はcodeyのライブラリを活用して、外部へHTTP GETして表示するだけの単純なプログラムです。
HTTPリクエストにはureqeustを利用します。

import codey, time, event
# import ureqeust
import urequests as requests

@event.button_a_pressed
def on_button_a_pressed():
    res = ""
    codey.wifi.start('SSID', 'PASSWORD', codey.wifi.STA)
    time.sleep(1)
    if codey.wifi.is_connected():
        codey.emotion.smile()
        res = requests.get(url = 'http://www.hits-net.com/blog/ip2.php').text
        codey.display.show("myIP:" + res, wait=False)
        
    else:
        codey.emotion.shiver()

これを実行すると、このサーバ上のIPアドレスを表示するだけのPHPの実行結果を拾ってLCDに表示します。

こいつデバッグが超しづらい。
MicroPythonだとWebREPLっていうブラウザ経由で対話型に実行する仕組みとかを使って皆さんやってるみたいなのですが、codeyにファイルを転送する仕組み、ってかそもそもできんのか・・・?がわからず、とりあえずディスプレイの表示とかcodeyの動きを頼りにデバッグするしかないですね。

ここまで動けば、あとはもうセンサーの結果を拾ってPOSTしたり、別のサーバ上からコマンドをGETで拾ったりといろいろできそうなことがわかります。

codey rocky自体にもクラウドメッセージという機能があるみたいですがまだ使い方がわかりません。。。
あと将来的にIFTTTに対応するとかしないとかの話もあるようです。

赤外線周りも使えそうなので、ちょっとしたリモコンにもできる・・・かなぁ。

【バックナンバー】

ではでは。またの機会に。

STEM教育用のおもちゃ「codey rocky」を買ってみた

ども。こんにちは。

唐突に「ロボットのおもちゃ」がほしいなぁと思い、Amazon「のコミュニケーションロボット」を眺めたら良さそうなものがあったので買ってみましたとかそんな感じの話です。

COZMOとか言うのが面白そうだったんですが、お値段が結構高いのと、製造元のAnkiという会社が開発を終了したらしいです。

COZMOは過去HIKAKINさんがYouTubeで紹介していますね。

この分野あまり興味なかったのですがこんな記事がありました。

家庭用ロボットのAnkiが経営破綻、その“失敗”が残した功績と教訓

そういやペッパーくんも最近見かけませんねえ。

で、今回購入したのは、

Makeblock プログラミングロボット codey rocky 日本語版 【日本正規代理店品】

¥13,800なり。ちょっとおもちゃにしては高いか。

対象年齢は6歳以上らしいですが、おっさんもう軽く30オーバーだよ。。。

これは上述のCOZMOのような感じではなく、教育用?のロボットみたいです。
最近では小学校でのプログラミング教育が必修化とかそんな話もあるみたいですね。
海外ではSTEM教育(“Science, Technology, Engineering and Mathematics” の頭文字)なんていう言葉もあるみたいです。

で、このcodey rockyは自分でプログラムを書いて実行させられます。
しかも、ScratchベースのプログラムだけじゃなくPythonでコードが書けるらしい。

またいろんなセンサーがついていて、センサーを組み合わせたちょっとしたIoT的なこともできそう。赤外線も送受信できるみたい。どこまでこちらがわで制御できるかはまだ調べてないですが、Wi-FiやBluetoothも使えるみたい。

制御基板にESP32というのが搭載されていて、割とIoT界隈では著名なチップのようです。

参考リンク

最近の子供は面白そうなおもちゃがあって羨ましいですね。

前置きが長くなりましたが、届いたので開封します。

異国のキッズが楽しそうに遊んでいるパッケージ。

ROBOT LIFEという会社が代理店をしているみたいです。

箱の中身。

mblockというアプリのダウンロード方法がかかられたかんたんなガイドと電圧などの規格が書かれた紙、謎のシール・・・?子ども用なのでお名前シールといったところでしょうか?

本体。これはcodeyですね。

下側にはrockyとUSBケーブル(Micro B-A)とストラップが入っていました。

codeyとrockeyを合体させてみました。

電源を入れたところ。なんかうにゃうにゃ言ってます。

初期状態である程度プログラムが入っているようで、AボタンやBボタンを押すと反応します。

もちろんそれが目的ではないので、続いてPCの準備をします。

環境はmacOS Catalina 10.15.3です。

以下のURLからmblockというIDEをダウンロードします。

https://www.mblock.cc/ja-jp/download/

インストールします。って、これ6歳でできるかな・・・?
特にmacOSだと野良アプリはブロックされるし。

とりあえず立ち上げて、サインインします。今回はGoogleアカウントでサインインしました。

【2020/02/11追記】
mBlockにGoogleアカウントでサインインしていましたが、保存がうまく行かなかったり、makeblock社のサイト上でのプロフィールが見れなかったりと不具合があったので、結局個別アカウントを作成しました。
また、IoT関連のブロックを使って天気や気温を外部から取得する場合、ここで登録したアカウント?に発行されるAPIキーを使うようなので、アカウントがちゃんと動作していないとIoT関連機能が一部使えない模様です。

こんなGUI。

続いてCodeyに接続してみます。付属のUSBケーブルとPCをつないでデバイスタブから接続をクリック。
ちなみに、Bluetoothで接続してプログラムをアップロードしたりするには、PC用の専用ドングルがいるらしいです。
¥2,500くらいするのでまぁケーブルでいいか。

とりあえずファームウェアを更新しました。

いろんな各様拡張機能があったので全部突っ込みました。

とりあえず、適当に作ってみました。
Scratchベースでブロックを組み合わせればすぐに作れます。
また、ブロックをPythonコードで表示することもできます。

ブロックベースで作ったものはPhtyonのコードで表示できますが、編集はできない模様です。また1からPythonで作ることもできます。一応補完機能とかも付いてるのですが、拡張のIRとかに関してはコードの補完ができないっぽい。

なので、ブロックで適当に組んでコードをみて、それを別のエディアとかに貼り付けながら、Pythonで書き起こすっていう使い方になりそう。

ブロック

コード

# generated by mBlock5 for codey & rocky
# codes make you happy
import codey, time, rocky, event

@event.button_a_pressed
def on_button_a_pressed():
    time.sleep(1)
    codey.emotion.look_around()
    if rocky.color_ir_sensor.is_obstacle_ahead():
        codey.emotion.sad()
        codey.stop_all_scripts()

    rocky.forward(50, 1, straight = True)

上記のプログラムをcodey rockyにアップロードするとこんな動作になります。

 

おー、これなかなか楽しいぞ。
画像認識とかもできるようなので、もうちょっと色々触ってみます。

普通に大人向けのプログラミングの実習にも使えそうな気がしますねー。

てか大人でもここまで一発でできない人多いと思う。。。

ではでは。またの機会に。