学生さん向けのオンラインNode-REDハンズオンをやってきました

コロナの関係で、地方の勉強会コミュニティはかなりひっそりとした状況。 基本的にオンラインでやれば地域間の格差もないですし、移動のコストもかからないので、運営・参加者双方にとってWin-Winの状況だと思います。それはわかっているんんだけど…

自分の所属しているNode-RED UG Tokaiもコロナ前に立ち上げたもののほとんど活動できていない状況で、閑古鳥泣いてる…。

そんな中、名城大学さんで行われている「ITエンジニア育成プロジェクト」さんからお声がけをいただきまして、名城大学の学生さん向けにNode-REDのハンズオンをさせていただく機会を頂きました。 内容は準備期間も限られていたこともあり、昨年UGで行ったオンラインハンズオンの内容の説明を初学者向けに修正して行う形式としました。

f:id:ueponx:20210714122619j:plain

こちらのQiitaエントリーを見ながらのハンズオンとなります

qiita.com

内容的には以下の書籍の1章から3章の内容を説明した形でしょうか。

久々のオンライン・ハンズオン

対面形式のハンズオンなどではやはり作業をしている方々の顔や雰囲気を読み取ることができるので、話す側としては、ここが詰まっているのかなと、簡単そうだからここは説明を簡単にしようなど、対応ができるのですがオンラインで名前だけがみえるという状況はかなり対応が難しいなと思いました。自分以外のオンラインサポートをしてくれたメンバーの方もチャットで大変なのかなと思っていました。

そういえばZoomってなんで画面共有者からチャットウインドウが見にくいのだろうか…

最初は進捗をまったりしようかなと思っていたのですが、反応が薄いし、状況もわからないので途中からは自分のペースですすめてしまった感じです。最後のほうは結構早口になってしまったかなと思いましたが、小一時間で内容を完走しました。

反省点・感想

今回は受講者が学生さんといっても学年にかなり開きがあり、周辺の理解度にも差があったので、Web知ってるるだろう…、REST APIという考え方もなんとかなるだろう…、JSON形式のデータが収受するところは図示しよう、などと事前想定をしていましたが、わりとその予想も雑だったかなと思いました。

今後は対象者がどのレベル感なのかはもう少し考えたほうがいいのかもしれません(常識かもしれないですが)。対面時のように様子がわかれば、説明時間の割り振りもできるのですが、オンラインでは事前情報が命ともいえますね。

ただ、比較的、資料を手取り足取りという感じで資料を作っていたのでハンズオンで挫折した方がいなかったのは良かったかなと思っています。

オンラインのハンズオンは、初学者から見ればスタートラインに立つハードルが結構高い印象をうけました。勉強を始めるための、スタートラインに立つ部分の需要は割とあるのかも?(それがICTリテラシーなのかも?)

私は、現在対面形式で小学生を相手にプログラミング教室をやっているのですが、オンラインとは全く違い、進捗の様子や楽しさの反応など非常にわかりやすくのですが、子供向けのオンライン授業はかなり関係値(人間関係)が出来上がったコミュニティ(学校など)または明確な目的(受験や学ぶ意欲)が存在しないと成立しにくいのかなと感じています。オンラインは否定しないけど、授業中の孤独感をどう埋めるかは大きな課題だと感じています。

本当に大学の先生方オンラインでよく心折れないなあと思いつつ、このエントリーは終わります。

今回、Node-REDのハンズオンを行う機会をいただいた、名城大学鈴木先生ありがとうございます。次はもっといい内容にしたいです!また、一緒にサポートをしていただいた石井さん、高尾さん、萩野さん、IBMの方々にもお礼申し上げます。

Windows11が発表されたので手持ちの古めのPCの対応状況をチェック

Windows11の発表が行われました。Windows10自体もかなり長い時間リリースされているので、このままでいくのかな?と思っていましたが、いよいよバージョンアップとなるようです。最近ではWSLなどの進展もありWindowsというOS自体も当初とかかなり変わってきたように思います。そろそろ家にあるPCたちも引導を渡されるのだろうかと思って、Windows11まで延命できるかなどを調べてみました。

公式サイトは以下のようなデザインになっています。壁紙はきれいな感じですね・・・背景を黒にしてしまう自分には全く関係ないですがw

www.microsoft.com

f:id:ueponx:20210705225116p:plain

f:id:ueponx:20210705225111p:plain

続きを読む

Raspberry PiでのRaspberry Pi PicoのMicroPython開発環境はどうなの?(2021.06)

先日のエントリではRaspberry Pi Pico(以下Pico)でLチカの次の段階ということでUSBデバイス(キーボード)を作ってみました。そのときの開発環境はWindowsPCにVisual Studio Codeをインストールして、USBストレージとして見えるPico(MicroPython環境設定済み)のファイルを編集するというようなものでした。それでも割と問題ないのですが、折角Picoを使っているので、開発環境すべてをRaspberry Pi印でそろえるっていうのはどうだろうかと考え、今回のこのようなものを書いてみました。

Raspberry PiPicoがあれば格安で開発できるんじゃね?という安易な考え方ではありますが、子どもたち向けにやるにはかなり価格的なハードルが下がるのかなという観点でもあります。

では、現時点(2021年6月)での開発環境を見てみようと思います。

過去エントリー参考

uepon.hatenadiary.com

続きを読む

Raspberry Pi Picoをカスタムキーボード化して「くぁwせdrftgyふじこlp」キーボード爆誕!

f:id:ueponx:20210610002739p:plain

(2021.06.11)コードの記述が短縮できたので追記しました

少し前からRaspberry Pi Pico(以下Pico)のネタを書いていますが、そろそろやろうとしていた、キーボード化に挑戦してみます。 んで、とりあえずはマクロキー化をする感じで考えていましたが、少しネタっぽい感じで「くぁwせdrftgyふじこlp」というフレーズを1キーで入力できる、バカキーボードを作ってみることにします。基本的なプログラミングに関しては、ほぼ同じなので、これを見ながら自分のお好みのものを作ってもらえればと思います。

早速、その過程を記載していこうと思います。

まずはLチカ

以前のエントリーではREPL環境でのインタプリタでLチカを行っていましたが、今回はファイルにMicroPythonのコードを書いて実行していこうと思います。PicoをUSB接続するとストレージとして認識されるのでその中にあるcode.pyを編集していくことになります。

※RaspberryPiで開発環境を整えるためにThonny Python IDEMU Editorを使おうかなと思ったのですが、普通にUSBストレージ内のファイルをVisual Studio Codeで編集して保存するだけで開発できたので、そのまま開発していこうと思います。RaspberryPiでの開発環境については別のエントリーで言及しようかと

USBストレージ内のcode.pyというファイルを編集するだけでファイルの中身が自動的に実行されます。ネット情報ではmain.pyというファイルでもいいのかなと思ったのですが、code.pyのほうが優先されるようです。

まずはLチカを行ってみます。本体のLEDのはGP25として定義されています。ではこのLEDを点灯させるコードを書いていこうと思います。

本体LEDを使用してLチカ

import digitalio
from board import *
import time

led = digitalio.DigitalInOut(GP25)
led.direction = digitalio.Direction.OUTPUT

while True:
    led.value = True
    time.sleep(0.1)
    led.value = False
    time.sleep(0.1)

上記のコードで本体のLチカを行うことができます。基本的にはIOピンを出力設定をして、on/offを設定するだけで点滅ができます。

本体上のLED位置

f:id:ueponx:20210610000652p:plain

Lチカの様子 youtu.be

そこまで難しくはありません。

タクトスイッチを入れる

バカデバイスとはいっても自作キーボードなのでやっぱりボタンが必要です。そこでタクトスイッチをIOに接続して、それを押したらLEDを点灯させてみます。

GP13ピンにタクトスイッチを接続して、プルダウンモードで動作をさせます。(押したときにON=Trueになる)

f:id:ueponx:20210609235610p:plain

今回は少し大きめのタクトスイッチがあったので、それを使ってみました。もちろん一般的なタクトスイッチでも動作には問題ありません。

f:id:ueponx:20210610004155j:plain

タクトスイッチを押すと本体のLEDをLチカさせる

import board
import digitalio

led = digitalio.DigitalInOut(board.GP25)
led.direction = digitalio.Direction.OUTPUT
button = digitalio.DigitalInOut(board.GP13)
button.switch_to_input(pull=digitalio.Pull.DOWN)

while True:
    led.value = button.value

動作の様子

youtu.be

あともう少しでキーボードが完成になります。

PicoをUSBキーボード化する

PicoをUSBキーボード化するにはライブラリが必要になります。USBストレージのlibディレクトリにAdafruit HID Libraryをコピーすることでライブラリのインストールができます。

ライブラリのダウンロード

ライブラリに関しては以下のリンクからダウンロードできます。CircuitPythonのバージョンによってファイルが異なるので、導入したバージョンをみてファイルをダウンロードして展開を行ってください。

circuitpython.org

自分は以下のuf2ファイルを使用してMicroPython環境を作成したのでBundle Version 6.x側をダウンロードしました。

f:id:ueponx:20210610220032p:plain

f:id:ueponx:20210610215924p:plain

ダウンロードが終わったら、展開をしておきましょう。ライブラリもかなり大量のファイルがあるのでかなりサイズが大きいです。

f:id:ueponx:20210610223253p:plain

Picoへライブラリーをコピー

USBのデバイス化をおこなうライブラリは先程のファイルを展開した中のadafruit_hidフォルダがあるので、USBストレージのlibフォルダにコピーします。他所の情報ではコピーするとは書いてあったのですが、ファイル単体なのかフォルダごとなのかがわからない記述も多かったのですが、試したところ「フォルダごとコピーすればOK」だったようです。

コピー後のツリー表示は以下のようになっていれば動作します。

f:id:ueponx:20210610001323p:plain

f:id:ueponx:20210610001131p:plain

USBのHIDドライバもかなり種類がありますね。

f:id:ueponx:20210610001134p:plain

「くぁwせdrftgyふじこlp」キーボードを作る!

ライブラリファイルのコピーが終わったらあとはcode.pyを以下の様に編集していきます。

先程のタクトキーを押したらLEDが点灯するというのにキー操作を行う処理を追加すればほぼ終わりです。

タクトスイッチを押すと、キーボードで「くぁwせdrftgyふじこlp」を入力する(入力中は本体のLEDを点灯させる)

import time
import board
import digitalio
import usb_hid
from adafruit_hid.keyboard import Keyboard
from adafruit_hid.keycode import Keycode

def keyInput(keycodeName):
    keyboard.send(keycodeName)

keyboard = Keyboard(usb_hid.devices)

led = digitalio.DigitalInOut(board.GP25)
led.direction = digitalio.Direction.OUTPUT
button = digitalio.DigitalInOut(board.GP13)
button.switch_to_input(pull=digitalio.Pull.DOWN)
led.value = False

while True:
    if button.value:
        led.value = True
        # 日本語変換モードに切り替える
        # keyboard.send(Keycode.ALT, Keycode.GRAVE_ACCENT)

        keyInput(Keycode.Q)
        keyInput(Keycode.A)
        keyInput(Keycode.W)
        keyInput(Keycode.S)
        keyInput(Keycode.E)
        keyInput(Keycode.D)
        keyInput(Keycode.R)
        keyInput(Keycode.F)
        keyInput(Keycode.T)
        keyInput(Keycode.G)
        keyInput(Keycode.Y)
        keyInput(Keycode.H)
        keyInput(Keycode.U)
        keyInput(Keycode.J)
        keyInput(Keycode.I)
        keyInput(Keycode.K)
        keyInput(Keycode.O)
        keyInput(Keycode.L)
        keyInput(Keycode.P)
        keyInput(Keycode.ENTER)

        # 日本語変換モードから英数モードに切り替える
        # keyboard.send(Keycode.ALT, Keycode.GRAVE_ACCENT)
        led.value = False

adafruit_hid.keyboard()の引数にキーの名前をしてすればキーモード入力ができます。以下が参考になります。

circuitpython.readthedocs.io

キーコードは以下が参考になると思います。

github.com

ちなみに今回は入力時には日本語入力モード変換にしてあるという前提で処理を記述しています。もし英数入力モードから日本語入力モードに変換する部分も入れたい場合にはコメントアウトしている部分を処理に入れてください。日本語109キーボードにある【全角/半角】キーは使えないので、USキーボード同様に【ALT】キー+ 【`】キーで日本語入力モードに変えています。この処理がトグルなので、元の状態関係なく日本語入力にして元に戻すにはWindowsの場合はIMEなどの設定を変更する必要があります。(ちょっと面倒)

あと【`】はバッククォートだと思っていたのですが、キーコードとしてはGRAVE_ACCENTを使うようです。

ja.wikipedia.org

では動作させてみます。

youtu.be

追記(2021.06.11)

先程のコードではいちいち1つのキーを押下するのにコードを書いていましたが、さすがにこれではコードが大量になってしまいます。そこで、USB_HIDにあるキーボードレイアウトというモジュールadafruit_hid.keyboard_layout_usを使用することで、キーコードの指定ではなく文字列を引数にすることで簡単に入力ができます。特殊キーの同時入力はできませんが、シフトキーなど押しながらの入力に関しては文字を判別してキーコードを判別してくれるのでかなり記述は楽になります。

adafruit_hid.keyboard_layout_usモジュールを使用して書き直す

import time
import board
import digitalio
import usb_hid
from adafruit_hid.keyboard import Keyboard
from adafruit_hid.keycode import Keycode
from adafruit_hid.keyboard_layout_us import KeyboardLayoutUS #追加部分

def keyInput(keycodeName):
    keyboard.send(keycodeName)

keyboard = Keyboard(usb_hid.devices)
layout = KeyboardLayoutUS(keyboard)  #追加部分

led = digitalio.DigitalInOut(board.GP25)
led.direction = digitalio.Direction.OUTPUT
button = digitalio.DigitalInOut(board.GP13)
button.switch_to_input(pull=digitalio.Pull.DOWN)
led.value = False

# 「くぁwせdrftgyふじこlp」キーボード

while True:
    if button.value:
        led.value = True
        # 日本語変換モードに切り替える
        # keyboard.send(Keycode.ALT, Keycode.GRAVE_ACCENT)

        layout.write('qawsedrftgyhujikolp\n') #変更部分

        # 日本語変換モードから英数モードに切り替える
        # keyboard.send(Keycode.ALT, Keycode.GRAVE_ACCENT)
        led.value = False

これでかなりコードが短くなりました。あくまでもキーコードに関してはUS配列のキーボードのものを踏襲するので日本語109などとキーの刻印が違うときには少し挙動が変わるので注意が必要かもしれません。

おわりに

PicoをキーボードエミュレーションさせることでUSBキーボードにすることができました。タクトスイッチにキーバインドを割り当てることで目的のマクロキーボードを作る事ができます。キーボード以外にもHIDデバイスである、ゲームパッドバイスにすることやマウスとしても使用することができるので、ちょっとしたデバイスならすぐできてしまうのかも。

ゲームなどのキーボードを複数使うような操作もこれならできちゃいそうです。チート行為になる可能性があるのでその辺りは注意してください。

せっかく作った「くぁwせdrftgyふじこlp」キーボードですがそう使う機会はなさそうですけどねw

参考

uepon.hatenadiary.com

Raspberry Pi PicoをMicroPython環境(CircuitPython化)した後に元に戻す方法

前回のエントリでは、Raspberry Pi Pico(以降Picoと呼ぶ)をMicroPython環境で開発できるように設定をしました。

uepon.hatenadiary.com

このままMicroPython環境のままでもいいのですが、ArduinoIDEでも開発したいなあと思ったときに元に戻せないのは結構痛いです。そこで、元にちゃんと戻すことができるのか確認してみようと思います。あまり、そのあたりのことを書いたものがなかったので、本当に戻るのかなと不安もありましたし。

実は3枚セットで購入していたので初期状態のものも手元にあるので比較は簡単でした。 では、実際に行ってみます。

続きを読む
/* -----codeの行番号----- */