2021年8月27日金曜日

microSDを修理に出してみた

 Samsung microSDHC EVO+の32GBが壊れていたんだけど、保証があるとは知らずにずっと放置していたんだけど、どうやら10年保証らしい?ので試しにサポートに連絡してみた。

壊れていたのは2017年に購入したやつ。Raspberry Pi 3B+用に購入してたんだけど、結局SandiskのmicroSDで使っていたので殆ど使ってなかった…

久しぶりにカードリーダーに入れて認識しなかったので、スマホやらなんやら試したけど全く認識しなくなってた。
RAM化していないラズパイで常時稼働とかで壊れるならわかるけど殆ど使ってないぞ…

ということでサポートにお問い合わせしてみた。

SDカード関連のお問合せフォームから必要な情報を入力してお問い合わせすると次の日には連絡が来た。microSDカード本体と、データ消去同意書、レシートを添付して宅急便で送ってくれとのこと。

Amazonで購入していた正規代理店品だったのでとりあえずクリックポストで送付してみた。
クリックポスト、プリンタ必要だけど安いし、手軽でいいかも。


2021年8月14日土曜日

Seeeduino Xiaoでプロコンを使ってみた。

 Arduino USB Host Shield Library 2.0でNintendo Switch Pro Controllerのサポートが追加されていたのでSeeeduino XiaoでSAMD版のライブラリに移植して動くかどうか試してみた。

SAMD用のUSB Host LibraryはUSB Host Shield Library 2.0がベースなんだけど、最近は殆ど更新されていないので本家のライブラリから置き去りに…
PS5用コントローラサポートはむしろSAMD版のForkから本家に移植されているような流れかも。

ライブラリの構造も結構にているので移植は意外と簡単だった。
まずは単純にプロコンに関係していそうなファイルをそのままコピーしてみた。
SwitchProBT.h
SwitchProParser.cpp
SwitchProParser.h
SwitchProUSB.h
この4つのファイル。

するとプロコン用のボタンの定義(ButtonIndex)が無いので、controllerEnums.hを書き換えないといけないっぽい。これもそのまま使えそうだったので移植。(サポートしてないコントローラの分も追加されてしまうけどとりあえずそのままで…)

お次はMFK_CASTUINT8Tが定義されていない…
本家ではsettings.hで定義されているんだけど、SAMD版にはそもそもsettings.hがない。
ということでSwitchProBT.h内で定義してしまった。(適当…

あとはexampleのBluetoothの中のSwitchProBT.inoをコピーして、
USB Usb;をUSBHost UsbH;に
BTD Btd(&Usb);をBTD Btd(&UsbH);に
あとはUsb.をUsbH.に置き換えれば完成。

これをSeeeduino Xiaoに書き込んで前回同様に接続し(USBの電源を取るのがちょっと面倒だけど)適当なBluetoothドングルをつなげばプロコンが使える。

PS3とかPS4コンも結構いいけどPCでMacアドレス書き込んだりしないといけないのが面倒なのでプロコン結構便利だと思うんだけどなぁ
ESP32だとPS3とかPS4コンのArduinoライブラリはあるけどプロコンはIDF使わないとだめなのが少し面倒そうだし…

2021年8月7日土曜日

Raspberry Pi PicoからHTTPSでPOSTしてみた。

 前回Raspberry Pi PicoにLANモジュールを付けてLAN内でWebサーバのテストをしてみたけど、せっかくSSL対応のライブラリを入れたのでインターネット上のサーバーにHTTPSでPOSTしてみることに。

まずはサンプルコードをテストしてみる。
EthernetWebServer_SSLライブラリにはWebClient_SSLっていうサンプルがあって、証明書もヘッダファイルとして入っているっぽい。

とりあえずそのまま動かしてみた。前回同様、変更する場所はdefine.hのUSE_ETHERNET_ENCをtrueにしてほかをfalseにしただけ。

とりあえずSSLで通信はできてそう。

サンプルが動くことがわかったのでこのサンプルをちょっといじってLINE Notify APIを叩いて、LINEを送ってみた。
ESP-WROOM-02で作ったときみたいにinsecureでもいいんだけど今回はかんたんにトラストアンカーを作ってくれるサイトがあるらしいので(ライブラリに書いてあった)それを使用して証明書を作ってもらうことに。

まずはBearSSL Trust Anchors Generatorでnotify-api.line.meのトラストアンカーを作成する。Domains To Includeってところにnotify-api.line.meって入れて生成すると、下の方に出てくるのでそれをコピペしてサンプルのtrust_anchors.hと差し替える。

あとはサンプルのserver_host[]をnotify-api.line.meに変更して、GETしてる部分をLINE Notify用に書き換えただけ。
スケッチ貼り付けるまでじゃないと思うのでこんな感じの雰囲気で編集したということでスクショ。Tokenも直で入れちゃってるし…
これを実行すると{"status":200,"message":"ok"}が帰ってきてLineに通知が届いた。
このライブラリ、結構かんたんにHTTPSが扱えるので便利だなぁ。

サンプルがだいぶ汎用性持たせられてるっぽいのでRaspberry Pi Pico専用にスケッチを作ればもっとシンプルになるかも。
IoT的な何かをやるなら最近HTTPSが多いけどRaspberry Pi Picoのパワーを持ってしてやれば結構余裕かも。TwitterやLineのBotも普通に作れそう。WiFiならESP32やESP8266とかで直接できるようなライブラリあるのでソッチのほうがいいかも。

そういえばENC28J60自体は1MB/sぐらい出せそうらしいけど、Raspberry Pi Picoの性能だとどこまで引き出せるんだろうか?

2021年8月1日日曜日

Raspberry Pi PicoをLANにつないでみた

 この前入手したRaspberry Pi PicoだけどとりあえずArduino IDEで使えるようにしてみた。
ラズパイと言ったらIoT、インターネットに繋がないと!(偏見
ということで、SPI接続なイーサーネットコントローラを使用してネットワークに接続してみた。Wifiに接続するんだったらそもそもESP32でいいような気もするのであえて有線のLAN。

ArduinoでLANと言ったら今だとW5500のモジュールが結構小さくて、スケッチのサイズも小さくなるらしいんだけど、だいぶ前に買ったENC28J60のモジュールがあったのでとりあえずそれを使用することに。UNOに比べてリソースたっぷりあるし。

中にはPIOとDMAを駆使してRMII実装してLAN8720を使えるようにしてる人もいるみたいだけど、今回はライブラリ豊富なSPI接続タイプを…

まずはArduino IDEにRaspberry Pi Picoを追加する。

とりあえずArduinoCore-mbedの方にした。これはArduino純正なのでボードマネージャーからそのまま入れることができる。

次にENC28J60を使うためのライブラリを入れる。
EthernetENCっていうライブラリが便利そうだったのでこちらをライブラリマネージャーからインストール。ライブラリマネージャーから入れられるのもかんたんで良いね。
このEthernetENCはArduino純正のSPIライブラリに対応しているので結構いろんなマイコンで動くらしい。
あとはArduinoのEthernetサンプルのEthernet.hをEthernetENC.hに変更するだけで大抵は動くらしい。UDPマルチキャストには対応していないみたいなのでmDNSとかUPnPとか一部動かない機能もあるかも。
お次はRaspberry Pi PicoとENC28J60モジュールの接続。
Raspberry Pi Picoの3.3Vは800mA流せるDC/DCコンバーター(RT6150B)っぽいので最大180mA流れるENC28J60もダイレクトにつないでしまって大丈夫そう。
ArduinoCore-mbedでSPIを使用する場合、デフォルトで、
MOSI: 3
MISO: 4
SCK: 2
SS: 5
になってる模様。ENC28J60のSIはMOSI、SOはMISO、SCKはSCK、SSはCS、あとは電源とグラウンドの6本繋げばOK。まだピンヘッダ実装していないのでとりあえず適当に…

とりあえずサンプルスケッチを動かしてみた。EthernetのWebServerの
#include <Ethernet.h>を#include <EthernetENC.h>に変更して
Ethernet.init(5);の部分のコメントアウトを外すだけ。
IPアドレスはセグメントを合わせるために変更。

とりあえずこれでLANに接続することができた。ブラウザからアクセスするとシリアルコンソールにブラウザの情報が表示される。(ブラウザになにか表示させるサンプルではない) Arduino UNOとかだとこのサンプルだけでかなり容量食ってしまうんだけどさすがRaspberry Pi Picoは余裕っぽい。

とりあえず動作確認はできたので次はEthernetWebServer_SSLを使ってSSLに対応させてみる。
EthernetWebServer_SSLもライブラリマネージャーから入れることができる。
とりあえずEthernetWebServer_SSL→WebServerを試してみる。
define.hタブを開いて、
#define USE_ETHERNET          true
をfalseに
#define USE_ETHERNET_ENC      false
をtrueに変更する。

あとはそのまま書き込むだけ。最初からこのサンプルを試したほうが良かったかもしれないぐらいかんたんだった…
ちなみにArduino IDEから書き込み失敗する場合はBOOTSELボタンを押した状態でUSBを指し直すといけるっぽい。
シリアルコンソールに表示されるIPアドレスにブラウザからアクセスするだけでブラウザに文字が表示される。これぞ本当のWebServer。

まだこのライブラリを入れた本当の意味であるSSLは試せてないんだけど長くなったので次回に続く。ローカルならSSLあんまりいらないかもしれないけど、インターネットに繋ぐなら最近はHTTPS多いしこのライブラリ重要かも?
Raspberry Pi PicoぐらいリソースがあればインターフェースとしてLANも悪くないかも。パルストランスでアイソレートされてたりするし。

2021年7月24日土曜日

Raspberry Pi Picoを買ってみた

 そういえば買えるようになったら買おうと思っていたラズパイピコの在庫があったので買ってみた。ピンヘッダ付きとか何かとセットになってるやつは在庫あるのに単品の550円で買えるやつがなかなか在庫なかったので諦めてたんだけど。

たしかにピンヘッダ付きもいいんだけどピンヘッダ持ってるし、なによりこのコスパの高さがこいつのいいところな気がして…
microUSBなのは少し残念だが、もげにくようなスルーホールタイプの端子なのでいいかも。USBホスト機能もついてるようなのでmicroUSB用のOTGケーブルもあるといいかも。FireTVとかで使うようなUSBから給電できるやつたとか。
ピン名は裏面にシルクで印刷されている。これブレッドボードとかに指しちゃうと不便かも。書き込みボタンが無かったらピンヘッダを裏表逆にハンダする人もいそう。

デフォルトではMicroPythonで開発できるようになってるっぽい。Linuxが動くラズパイではPythonで色々作ってみてるけど、マイコン用のPythonはどんな感じなんだろうか…
とりあえずArduino IDEも対応しているようだからArduino IDE使おうかなぁ

2021年7月18日日曜日

WT32-SC01でタッチパネル対応GUIを使ってみる。

 先日入手したWT32-SC01でタッチスクリーンを試すのにかっこいいGUIが作れるLVGLライブラリを使ってみた。このライブラリを使うと画像ファイルなしでもかっこいいGUIが作れるらしい?

Arduino IDEでも使えるようだし、液晶パネルのライブラリは前回使用したTFT_eSPIライブラリをそのまま使えるみたい。TFT_eSPIのタッチパネル対応は抵抗膜方式だけっぽかったのでLVGLライブラリでタッチパネルに対応させるためには別なライブラリを使用することに。

まずはタッチパネルの動作確認から。
WT32-SC01のタッチパネル用ライブラリはArduino-FT6336Uを使ってみた。設定もシンプルで良さそうだったし。

WT32-SC01ではFT6336Uの接続はI2Cのみの接続になっていたので、ライブラリで使われている割り込みPinとリセットPinはTPで出ているだけで未接続だった。なのでタッチパネルに触ったかどうかの判別はポーリングで行うことに。

とりあえずサンプルスケッチで動作確認。

#include "FT6336U.h"
#define I2C_SDA 18
#define I2C_SCL 19

FT6336U ft6336u(I2C_SDA, I2C_SCL, -1, -1);

サンプルスケッチの上の方はこんな感じで割り込みPinとリセットPinを無効にしてみた。そんでもってINT_N_PINの判別をなくしてシリアルコンソールで入力を確認できた。

ft6336u.read_td_status()

でタッチパネルに触れている指の数(最大2)がわかるっぽいので、ポーリングだけでも触ったことがわかりそうだから問題なさそう。

タッチパネルがなんとなく動いてそうなことがわかったのでお次はLVGLの設定。LVGLライブラリの設定は結構たいへんだった…
まずはライブラリを入れたあとにlv_conf_template.hをArduinoのlibrariesにlv_conf.hとしてコピーして"#if 0"を"#if 1"に変更したり、DEMOを使えるように#define LV_USE_DEMO_WIDGETSを1に変更したりexampleフォルダをコピーしたりする。詳しくは本家サイト参照

そんでもってサンプルのLVGL_Arduino.inoをいじってタッチパネル部分をFT6336Uに対応させてみた。

先程のサンプルスケッチの上の方をそのまま移植して、

void my_touchpad_read( lv_indev_drv_t * indev_drv, lv_indev_data_t * data )
{
    uint16_t touchX, touchY;

    uint8_t touched = ft6336u.read_td_status();
    if( touched == 0 )
    {
        data->state = LV_INDEV_STATE_REL;
    }
    else
    {
        data->state = LV_INDEV_STATE_PR;
        touchY = 320 - ft6336u.read_touch1_x();
        touchX = ft6336u.read_touch1_y();
        data->point.x = touchX;
        data->point.y = touchY;
    }
}

タッチパネルが90°ズレていたのでmy_touchpad_read関数を上のように変更した。

setup内ではtft.setRotation( 1 );をtft.setRotation( 3);に変更して液晶の向きを戻して、tft.setTouch( calData );をft6336u.begin();に変更してTFT_eSPIのタッチパネル機能から別ライブラリのArduino-FT6336Uに変更できた。
TFT_eSPIの設定は前回のものそのままで使用できた。例によってバックライト用の2行も追加しないと画面が真っ暗のままなので注意。

ちなみにタッチスクリーンを使うときは上の方で出てきたlv_conf.hの中の#define LV_TICK_CUSTOMを1に変更する必要があるっぽい。(これをやらないと読み込まれない)
そしてついでにタッチパネルのテストをしたいので#define LV_USE_DEMO_WIDGETSも1にしておいた。

サンプルスケッチのlv_demo_widgets();のコメントアウトを外して書き込めばとりあえずタッチパネルのテストができる。

LVGL Arduino
とりあえずシングルタッチで実装してみたけどスワイプもいい感じに動いてる。ESP32でこんなにきれいなGUIを実装できるなんてLVGLライブラリ恐るべし。
欲を言えばGUIのツールとかで作れたら良いんだけどなぁ
LVGLのサンプル動かすのも結構設定が面倒だったので、簡単にタッチLCDを動かしたいなら多少高くてもM5Stackとかのほうがいいんだろうなぁ…

このWidgetサンプルを実行するのも少し大変だったけど、LVGLライブラリがWT32-SC01上で動くことがわかったのでこれでかっこいいGUI使ったなにか作れるかな。


2021年7月17日土曜日

WT32-SC01を買ってみた。

 Aliexpressを見ていたらESP32に静電容量式タッチ対応LCDがついたボードが安かったのでポチってみた。WT32-SC01ってやつ。3500円ぐらいだった。M5Stackとかもいいなーと思っていたんだけどこっちのほうが安くてLCDも大きかったので…

ESP32-WROVER-Bモジュールと3.5インチのSPI接続のディスプレイが乗っている。2ポイントまでの静電容量タッチディスプレイらしい。
WL-352215
表面はツルツル。左側に穴が空いているように見えるけど黒い部分が抜かれてるだけで、部品は未実装だった。光センサとかつけようとしていたのかな?
裏面にはピンヘッダが並んでいる。このピンヘッダ、2.0mmピッチっぽいので少し扱いにくいかも…
USBシリアル変換機も内蔵していててSiliconLabsのVCPドライバを入れておけば認識する。
ちなみに発注時の画像にも合ったけど技適マーク付きのESP32-WROVER-Bモジュールだった。

LCDのコントローラはST7796SでESP32とはSPI接続されているっぽい。タッチコントローラはFT6336UがI2Cで接続されている。バックライトはPWMで調整できる。

まずはArduino IDEを使ってLCD表示を試してみた。
使用したライブラリはTFT_eSPI

ライブラリマネージャからライブラリをインストールしたらライブラリのフォルダに行って(Arduino\libraries\TFT_eSPIの中)
User_Setup.hをWT32-SC01用に書き換える。
上の方からディスプレイコントローラは
#define ST7796_DRIVER
のところだけをコメントアウト外す。(他のところはコメントアウト)
ピン配置設定のところは全部コメントアウトして
#define USE_HSPI_PORT 1 
#define TFT_MISO 12 
#define TFT_MOSI 13 
#define TFT_SCLK 14 
#define TFT_CS 15 
#define TFT_DC 21 
#define TFT_RST 22 
#define TFT_BL 23 
とした。
そしてSPIクロック設定は
#define SPI_FREQUENCY  80000000
に変更した。
あとは適当なサンプルを実行してみた。
バックライトをONにするために

pinMode(TFT_BL, OUTPUT);
digitalWrite(TFT_BL, 128);
上の2行を
tft.init();
の下辺りに入れる。128のところを変更すれば明るさが調整できるので可変できるようにしてもいいかも。
最初User_Setup.hをいじるの知らなくてバックライトがうねうねしてたけどちゃんと設定したら映った。
解像度も480x320あるので結構色々な情報が表示できそう。ESP32はCANトランシーバをつけるだけでCANが使えるので車載OBD2ディスプレイとかも作れそう。デュアルコア活用できそうだし。

LCDの動作確認もできたので次回はタッチスクリーンの確認してみないと。