Arduino IDEのボード Digistump AVR BoardsとATTinyCoreの違いメモ

どう違うのかわからなかったので調査したメモ

# Digistump AVR Boards

  • Path: AppData\Local\Arduino15\packages\digistump\hardware\avr\1.6.7\
## boards.txt
  • "Digispark (Default - 16.5 mhz)"がdigispark-tinyというエントリの名前になっている
  • digispark-tinyというエントリのcoreは"tiny"となっているので、見るべきmainのソースファイルはcore\tiny\main.cpp
## main.cpp
  • init();setup();for(;;)loop();だけ
  • init()はwiring.cにいる。sei()が入っているが、setup()より前に呼ばないといけないとコメントしてある。
## libraries\DigisparkKeyboard\DigiKeyboard.h
  • DigiKeyboardDeviceクラスのコンストラクタにcli()/sei()やusbDevice{Connect,Disconnect}()が含まれていて、クラス宣言直後にヘッダファイル内でグローバル変数DigiKeyboardとしてインスタンス化している。
  • グローバル変数の初期化タイミングでコンストラクタが呼ばれることで、main()よりも早くUSBデバイスとしての準備が完了する。行儀は良くない?
## まとめ
  • USBデバイスとしての機能の準備は、Digistumpボード側ではなく、DigiKeyboardなどのLibraries側がすべて担っている

 

# ATTinyCore

  • Path: AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.5.2\
## boards.txt
  • "ATtiny85 (Micronucleus / DigiSpark)"がattinyx5micrというエントリの名前になっている
  • attinyx5micrのbuild.coreはtinyなので、cores\tinyにmain.cppを見に行く
## main.cpp
  • Digistumpと同一なので割愛
  • init()はwiring.cにいる。Digisparkと違いがわからん
## まとめ
  • Digistumpとほぼ一緒じゃない?

 

# 実験

  • Digispark用にボード:Digistump AVR Boardsで作成したDigiMouseを使うマウスジグラーを、DigiMouseライブラリをボード:ATTinyCore側にコピーして同じコードで動かしてみる。
## 結果
  • ブートローダ(micronucleus)の再焼き込みは必要だったものの、普通にビルド&動作確認できた。
  • ボード的な設定の違いはそんなになさそう?V-USBを自前で配置するならどっちでもいいかも

Cleer ARC 3 MAX買った

 

最近出社の機会が増えて、いい感じのノイキャン有り・ながら聞き・低遅延イヤホンが欲しかったので買ってみました。

10月に店頭でGamingとMusic Proを試してみて、ながら聞きイヤホンにしては音も良く、低遅延も調整なしで音ゲーができるレベルに良く、ノイキャンも『人の声や店内BGMは通るけど店内の雑音/雑踏が消える』くらいでちょうど良かったので、全部込みのMAXが出るのを待ってました。個人的には色はGAMINGのほうが好きですね。

今のところは計算通りという感じの使い心地です。カナル型に比べて長時間かけてて疲れないですし、風呂上がりでも気軽に使えますし、何より会議で聞こえてくるおっさんの声が少し遠くて助かります。
音漏れも昔の2,000円くらいで売ってた耳掛けヘッドホン?よりは全然マシですね。

予想通りですが、ノイキャンはあまり強くないです。(というか構造上限界がある)
ドライヤーとかサーキュレーターの強風の音は消えませんが、サーキュレーターの弱風や食洗機や洗濯機の音とかは一段遠くに聞こえるので面白いです。
人の声は全くノイキャンかからないので、コンセプト的にも敢えて通しているような感じですね。

定位感も結構普通にいい感じです。まぁGAMINGがあるのでそれはそうという感じです。

 

アップデート関係について

結構アップデートするものが多かったのでまとめておきます。といっても↓に全部まとまってるので特に書くことはないんですが。

 

イヤホン本体のアップデート

Cleer ARC 3 ファームウェアアップデート手順 - Cleer

iPhone/Androidにイヤホンをペアリングした状態で、『アプリからイヤホンのアップデート』に従えばOKです。

 

充電ケースのアップデート

Cleer ARC 3 ファームウェアアップデート手順 - Cleer

同じくiPhone/Androidにイヤホンをペアリングした状態で、同ページの『アプリから充電ケースのアップデート』に従えばOKです。

 

ドングルのアップデート

ARC 3 サポート - Cleer

GAMINGとMAXは専用ドングルがあるので、こっちもアップデートします。
これはPCじゃないとアップデートができないので注意が必要です。(PC持ってない人はどうするんだこれ)

『Cleer ARC 3 Gaming/Max ドングルのファームウェア更新について ※2024年10月18日更新』に従って、PCにドングル接続して英語版のアップデータを実行します。数分かかります。

ファームウェアを更新する為には、一度イヤホンとドングルのペアリングを完了させておく必要があります。
開封直後で未使用の場合などは、必ず一度ペアリングを行ってからファームウェア更新を行ってください。

とのことなので、初めてドングル使う人は一度ペアリングしておきましょう。

 

以上です。

ATTiny85でdelay()が8倍時間かかる

ATTiny85でLチカしようとしたところ、LEDピンへのdigitalWrite()の後に差し込んだdelay(500)がなぜか8倍の4秒かかっているという現象に当たって困ったので、対処法のメモです。

 

martyworkshopdiary.blogspot.com

(↑の記事で詳しく書いてくれているので抜粋ですが)
買ったばかりのATTiny85は、(ボードやClock SourceやTimer 1 Clockの設定を確認した上で)一度ツール最下部の"ブートローダを書き込む"をする必要があるようです。

新品のATtiny85は、
Clock:8MHz、Prescale Resister:1/8になってるんですね。
なので、Timer1 clock:1MHzだったのです。

という話らしいです。

よく知らなかったんですが、ここらへんの設定変更した場合は基本的にスケッチ変更ではなくブートローダの書き込みが必要みたいですね。
ブートローダが必要ない人でもBoard: ATTinyCore"ATtiny25/45/85 (No bootloader)"を選択した状態で書き込みが必要です。

Arduino UNO R4 WiFiをArduino ISPにしようとしたら変なバグ踏んだ件

Arduino UNO R4 WiFiを買ってArduino ISP(Arduino as ISP)にしてATTiny85の開発をしようとしていたんですが、変なバグ踏んだのでメモ代わりに書き残しておきます。

 

元リンク:Can I use the R4 minima as an icsp? - UNO R4 Minima - Arduino Forum

 

(↑のArduino ForumスレッドのPost#4とその先のプルリクに全部書いてありますが)
Arduino IDE公式スケッチ例の"ArduinoISP"のソースコードはPIN_{MOSI,MISO,SCK}という名前のマクロを含んでいて、これがArduino UNO R4 Minima/WiFiのボード側のコードと名前衝突してしまっていて、まともに動かないようです。

対策としては↑のリンクに修正版のArduino ISPソースコードが置いてあるので、公式スケッチ例を使わずにそっちをコピペしてUNOに焼けばいいようです。
また、書き込み装置も"Arduino ISP"じゃなくて"Arduino as ISP (ATmega32U4)"(手元だと"Arduino Leo/Micro as ISP (ATMega32U4)")を使えとのことです。

 

私の手元ではまだArduino IDE 1.8.19を使っていてこの問題を踏んでいたので、ATTiny85を接続して書き込もうとすると以下のようなエラーが出て、Arduino ISPへの接続自体が失敗していました。

avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x00
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 2 of 10: not in sync: resp=0x00
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 3 of 10: not in sync: resp=0x00
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 4 of 10: not in sync: resp=0x00
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 5 of 10: not in sync: resp=0x00
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 6 of 10: not in sync: resp=0x00
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 7 of 10: not in sync: resp=0x00
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 8 of 10: not in sync: resp=0x00
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 9 of 10: not in sync: resp=0x00
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 10 of 10: not in sync: resp=0x00

また、書き込み時のコマンドラインプログラマがstk500v1になってたのも気になっていたので、コマンドラインからavrdude -c arduinoで接続を試みても以下のような感じでDevice Signatureが空になってしまいました。やっぱりちゃんと接続できてないようですね。

avrdude: Device signature = 0x000000

avrdude: Yikes! Invalid device signature.

Double check connections and try again, or use -F to override

this check.

 

何度接続ピン見直しても繋がらないのでATTiny85壊れたかと思ってFUSEリセットをやってみたら、FUSEリセット用のプログラムでは全然問題なく接続できたので、もしやArduino ISPがバグってるんじゃ…?と疑ってググったらこんな話でした、というオチです。

 

その他注意点としては、Arduino UNO R4はArduino AVR BoardsじゃなくてArduino Renesas UNO R4 Boardsという別のパッケージが必要になるくらいですかね。

 

追記:

Arduino IDEを2.3.2にアップグレードしたところ、Arduino ISPソースコードの名前衝突問題は修正されていて、公式のスケッチ例がそのまま使えるようになってました。

書き込み装置の方はやっぱり"Arduino as ISP"はstk500v1になっててダメなので、相変わらず"Arduino Leo/Micro as ISP (ATMega32U4)"を使わないといけないようです。

Luna Displayを買ったので、しばらく使ってみての感想

コンシューマーゲームをメインのディスプレイでやりながらPC作業もしたいなぁ。あとお絵描きもしたいなぁ」という感じのモチベでサブディスプレイ(液タブ)を買うか検討していたのですが、「手元のiPadがサブディスプレイになったら、ゲームもお絵描きもできるし完璧では?」と思い立って、10月半ばにLuna DisplayのHDMI版ドングルを買ってみました。

購入から一ヶ月くらい使ってみて、色々良いところ悪いところが見えたのですが、あまりレビュー等で書かれていないような内容だったので、自分で書いてみます。

※Luna DisplayはWiFi接続もサポートしてますが、我が家のWiFiはあんまりよろしくないので、基本的にUSB-Lightning接続で使っています。

 

良いところ

画質が良い!遅延が少ない!

これは公式でもアピールしてる部分ですが、Retina ResolutionをEnableにすると画質は素晴らしいです。普通にiPadの最大解像度で綺麗に見えます。

また、映像の遅延もメインディスプレイと比べて2F程度でほぼ気にならないレベルでした。

https://x.com/mogira_jubeat/status/1713782617508868271?s=20

https://x.com/mogira_jubeat/status/1713782617508868271?s=20

タッチ操作もApple Pencilも使える

これも公式でアピールしてる部分ですね。

ただ、Apple Pencilはmspaintで実験してみたところ正直お絵描きできるほどの反応速度ではないですね。(ちらっと適当に測った感じだと50msくらいです。)

遅延とか気にしないユースケースでタッチ操作したいだけなら問題はないですが、入力系の遅延はそこそこあるかなーという感じです。

なので、お絵描き用にWindowsで液タブ買おうと思っている人がこれで代替できるかというと微妙だと思います。素直に液タブ買うか、iPadで描いた方が良いと思います。

悪いところ

ここから長いです。

スタートアップ時に自動起動するオプションがない

スタートアップフォルダにショートカットをコピーしておいたら解決しましたが、個人的にはオプションで用意してほしかったですね。

接続が切れるタイミングが多い

接続中に急に途切れるという話ではなく、接続した状態でとあるアクションを行うと仕様的に必ず接続が切れるという話です。観測した限りでは以下の3つです。

  1. メインディスプレイの切断(接続先切り替えはOK)
  2. Windowsのロック
  3. iPadアプリの切り替え

1は表示モード:複製にしておいてメインディスプレイを別の映像入力に切り替えるのはOKみたいです。ただ、メインディスプレイの電源を落とせないので、夜寝る前に布団でiPadだけ~とかはできないですね。

そして2,3がかなりきついんですよね。。
2はよく使いますし、3は前述の通りWindowsでお絵描きは厳しいのでiPad側のお絵描きアプリに切り替えてお絵描きしようとすると、瞬時にというわけではないですが、しばらくしてLuna Displayアプリに戻ると切断されています。これが痛い……

再接続が面倒

初回接続時はまだいいんですが、上記1,2,3で切断した場合、iPadWindowsのアプリ再起動が必要になったり、最悪ドングルの再接続が必要になることがありました。

「なることがありました」と書いてますが、Windowsロックした場合はほぼ確実にどちらかのアプリを再起動する必要がありました。

ブラインドのままWindows側のロックを解除しても、上手く再接続されないことがあるのは痛いところです。

再接続後の設定が面倒

再接続が面倒とは言いましたが、再接続に伴って表示モードと拡大率の設定変更もしなくてはいけないので、これもかなり面倒です。

表示モード

表示モードはなぜか毎回『拡張』の状態で接続されます。毎回接続する度に『複製』に変更していますが一向に記憶されません。

しかも表示モードが『拡張』だと、ディスプレイの設定を変更しようとしてもプライマリディスプレイにしか設定ウィンドウが表示されないので、例えばメインディスプレイがプライマリでかつ既に別の接続先に切り替えていた場合、ブラインド状態でなんとかするか、再度メインディスプレイの接続先をPCに戻すみたいなことが必要です。控えめに言って最悪です。

一応複製モードへは、Win+Pの表示モード切り替えのポップアップを使うならWin+P→Tab→Home→↓キー→Enter、または『ファイル名を指定して実行』ダイアログを使ってWin+R→"DisplaySwitch /clone"と打つとブラインドでも切り替えられます。

拡大率

iPad接続時のLuna Displayの解像度は基本的にiPadの最大解像度になっていて、メインの4Kモニタと同じ拡大率だと細かすぎて見づらいので拡大率を上げたいところなんですが、メインディスプレイのみ使っているときは下げておきたいので、この辺の設定も毎回調整しています。
(メインのみ)150⇔(Luna)200~250%みたいな感じです。

 

という感じで、今のところサブディスプレイの代わりにも(Windows用の)液タブの代わりにもならないなぁというのが正直な感想です。

製品としては面白いですしスペック的にも十分だし、実際これで良いという人もいるとは思うんですが、個人的にはちょっと用途に合わないなぁという印象です。もう少し接続時のUXを上手いことしてくれると良いんですが。。

SEGGER emPower USB-Host+の紹介

これは何?

SEGGER社が開発したembOSというRTOSの上で動くemUSB-Hostという組み込み用のUSBプロトコルスタックを含むフレームワーク?の評価ボードみたいです。
簡単に言うとArduinoみたいな感じですね(全然違う)

開発元のSEGGERの日本国内代理店がEmbiTeKみたいです。私はEmbiTeKから2023年2月に¥4,290で購入しました。

このボードは呼び名がいっぱいあって正直よく分からないんですが、emPowerという評価ボードシリーズの廉価版がこれっぽいので、"emPower USB-Host+"というのが正式名称だと思っています。

開発はSEGGER Embedded Studioという専用のIDEで行い、書き込みとデバッグまでできます。

FWの更新はUSBメモリを使っても出来るらしいのですが、いまいちよく分からなかったので毎回IDEからコンパイルして書き込んでます。

電源&J-Link専用のMicroUSBポートと別で、USB 2.0のfull speed(12Mbps)とhigh speed(480Mbps)の2つのType-Aポートを備えています。ここにはUSBハブも繋げるようです。

LEDインジケータ

LED0~4の5つのLEDがユーザーからの任意操作が可能です。

(画像は公式ページより引用。LEDの配置を青枠で追記)

PWRのGreenLEDは電源投入中は常時点灯なので、ユーザー側からの操作は不可能です。

また、J-LinkのLEDもステータスインジケータになっているため、ユーザー側からの任意操作は不可能です。
J-Link LEDによるステータスの詳細はこちら。Bi-colorの方ですね → https://wiki.segger.com/UM08001_J-Link_/_J-Trace_User_Guide#Main_indicator

LED0&2 または 1&3 または(PWR Greenは常時点灯のため)4 を点灯させ、隣り合うGreen&Redを点灯させた状態にすると、Red LEDの影響でGreen LEDがOrangeに見えるので、実際はOrange&Redに見えます。

その他有用なリンク

よく公式のリンクが壊れてるので備忘録としてまとめておきます。

何ができるの?なんで買ったの?

USBホスト機能が使えます。

それだけならラズピコとかM5Stackとか色々選択肢はあるんですが、特筆すべき点としてAudio(USB Audio Class 1.0)を始めとした様々なデバイスクラスをデフォルトでサポートしています。
サポートしてるクラスドライバの詳細はこちら → emUSB-Host 対応クラスドライバ
また、こちらのリンク先にはサンプルが置いてあります → emUSB-Host Samples

USBホスト機能サポートと謳っててもデフォルトでサポートしてるのはキーボードやマウス等のHID程度なものが多く、特にオーディオサポートは探した限りこれしか見つかりませんでした。
さすがにオーディオのためだけに(raspi含めた)Linuxは使いたくないので、ワンボードなやつを探していました。

やりたかったのは、3.5mmでやり取りしてるアナログオーディオ信号をCreative BT-W3からBluetooth(aptX LL)で飛ばすことです。
スピーカーから出力してる音を、スピーカーとBTの両方で使えるようにしたかったんですよね。

一応調べたらそういう用途にピッタリなデバイスがプリンストンから出てるんですが、元々BT-W3はスマホに挿して使ってて、BTイヤホンの接続先切り替えって結構面倒だし、買うにも結構いい値段するし、BT-W3一個でどうにかなれ〜!というのが今回の主なモチベです。

なおCreative BT-W3は、ホストにUSBオーディオバイスとして接続され、ホストからUSBで受け取った音声信号をaptX LLやその他コーデックで圧縮してBluetoothで飛ばします。
なので、BT-W3経由で音声を飛ばしたいなら、まずはUSBホストとして音声データをUSBで渡せる必要があります。

実際に↑のやりたかったことは成功したので、その話はまた次回書きたいと思います。

今回はボードの紹介だけなのでこの辺で!

(この記事は、↑を3月に完成させたにも関わらず全然まとめ記事書く気が起きないまま半年以上経過したので、とりあえずボードだけでも紹介しておいて、本編を書くモチベを上げるための記事です。)

Arduino(for vscode)でM5Stack Core2の開発環境を整えようとしたら案外大変だった話

M5Stack Core2を買ったので、使いづらいArduino IDEを脱出して、Arduino for VSCodeで開発しようと思ったんですが、設定で結構手間取ったので、必要な項目をメモしておきます。

 

まず、Arduino IDEは普通のWindowsを入れましょう。Windows App版ではなくWindows版です。私はWindows App版を入れていたようなんですが、どうにもうまく設定できなかったので、Windows版を再インストールしました。
しなくてもいけたかもしれませんが、手元だとライブラリマネージャが使えなかったので諦めました。

 

VSCodeのsettings.jsonと<project>/.vscode/c_cpp_properties.jsonの設定

この辺が、調べれば調べるほど違う書き方が出てきて、よく分からなくなっていたところです。

(そもそも私がほぼvscodeを触っていなかったために勝手に混乱していたのですが)<project>/.vscode/c_cpp_properties.jsonはプロジェクト固有の設定で、settings.jsonは全体にかかる設定です。settings.jsonの設定を<project>/.vscode/c_cpp_properties.jsonオーバーロードしたり追加するような感じですね。

まず、VSCodeのsettings.jsonにはこの辺を書いておきましょう。

    "arduino.path""C:/Program Files (x86)/Arduino",
    "arduino.commandPath""arduino_debug.exe",
    "C_Cpp.intelliSenseEngine""Tag Parser",
    "C_Cpp.default.browse.path": [
        "${workspaceFolder}",
        "${config:arduino.path}/tools",
        "${config:arduino.path}/libraries",
        "${config:arduino.path}/tools",
        "${env:USERPROFILE}/Documents/Arduino/libraries"
    ]

arduino.pathとarduino.commandPathは設定必須ではないですが、その下のbrowse.pathの中で${config:arduino.path}と書くことで、arduino.pathを環境変数っぽく呼び出せるので、arduino.pathだけでも書いておくといいと思います。

また、browse.pathの最終行の${env:USERPROFILE}はお察しの通りWindows環境変数の%USERPROFILE%を呼び出しています。
Arduino用のライブラリはユーザーディレクトリ配下のドキュメント/Arduino/librariesに入っていたのでそこを指定しています。

この状態で一度.inoファイルを開いてArduino: Verifyを行うと、恐らく自動的に<project>/.vscode/c_cpp_properties.jsonが生成されます。

このままだと多分#include <M5Core2.h>がbrowse.pathにないとIntelliSenseが波線付けてくると思います。(IntelliSenseの話だけだとは思うのでコンパイルは通るかもしれません)

なので、波線の解決ヒントからIntelliSenseの構成画面を開き、構成名をArduinoに変更し、詳細設定の中の参照: パスのところに${default}と書いておきます。そうすると<project>/.vscode/c_cpp_properties.jsonが以下の内容になってると思います。

{
    "version"4,
    "configurations": [
...
        {
            "name""Arduino",
...
            "browse": {
                "path": [
                    "${default}"
                ]
            }
        }
]
}

ここまで書いておけば恐らくIntelliSenseやコンパイルで詰まることはないと思います。