2020/05/30

Arduino CLIの導入

Arduinoのコマンドライン環境 arduino-cli を触ってみる。

屋外設置のRaspberry pi3A+に導入し、接続した独自ボードに書き込みができる環境を構築してみた。 結論から言うと、一度コンフィグが済んでしまえば、コンパイル、アップロードはとても快適。 

手順を調べた時の環境 (2020年4月)
実行環境 :  Raspberrypi 3A+ , Raspberry pi 3B, RaspberryPi4B(4GB)
OSはRaspbian Burster(v7)で共通

バイナリ: arduino-cli_0.10.0_Linux-ARMv7.tar.gz
SSHターミナル:MovaXterm (Windows10)
ボード: Arduino Uno,  Arduino互換機 (Sanguinoベース)

最初の工程は大まかに4つ (2020年5月現在)

1 最新バイナリを任意のディレクトリに設置。バイナリはPathを通しておく
        RaspianだとLinux ARM 32bitでよいはず(そのうち64bitバージョンになりそう)

2 初期設定
       作業フォルダの設置
        Configファイルの初期化(ホームディレクトリに.arduino15が生成される)
                 $arduino-cli config init    
3 ボード関連のインストール 
       ボードインデックスの初期化
            $arduino-cli core update-index
        (確認)インストール可能なボード定義一覧のリスト表示
                 $arduino-cli core search
        ボード定義のインストール (リスト表示したIDを指定)例えば、
                $arduino-cli core install arduino:avr
        (確認)インストール済みボード定義の表示
                $arduino-cli core list
4 コンパイル、アップロードのテスト
        スケッチの作成(test という名のディレクトリ、.inoファイルの生成)
             $arduino-cli sketch new  test
        コンパイル(Ardiono UNO向け)
                成功するとアップロード用のバイナリがスケッチディレクトリに生成される
            $arduino-cli compile -b Arduino:avr:uno test
        アップロードのテスト (UNOをttyUSB0に繋いでいるとする)
                $arduino-cli upload -p /dev/ttyUSB0 -b arduino:avr:uno test
         
        (コンパイルできたら)何もしないスケッチなので、blink等をtest.inoに記述してみる
                                あとはライブラリをインストールするなど etc...
    
(任意) サードパーティのボード定義の追加、環境設定
        .arduino15内のarduino-cli.ymlの編集
              スケッチ設置場所の指定(デフォルトはホームディレクトリのArduinoフォルダ)
            (任意)additional urlsへ ボード定義の追加
             その後のインストール作業などは手順3以降の手続きを踏襲
     
  最初はコンパイルやアップロードのボード指定、ポート指定などがとっつきにくいが、随所でヘルプ(-h)を確認しながら慣れるしかない。コンパイルとアップロード回りはたくさんのオプションが存在する。
 ターゲットが固定であるなら、board attachでスケッチとボード、ポートを紐付けておくと楽。

     ボード定義には、名前のほかに、オプションで動作周波数やマイコン型番をリスト選択できるものがある。boardコマンドで確認してみよう。
    あらかじめarduino:avrをインストール済みであれば、MegaやPro miniがそれにあたる。
インストール済みのボード一覧を表示
            $arduino-cli board listall (インストールではなくリストオール)
ボードの詳細を確認(Arduino pro miniの場合)
            $ arduino-cli board details arduino:avr:pro
            Board name:     Arduino Pro or Pro Mini
            Required tools: arduino:avr-gcc                   7.3.0-atmel3.6.1-arduino5
                            arduino:avrdude                   6.3.0-arduino17
                            arduino:arduinoOTA                1.3.0
            Option:         Processor                         cpu
                            ATmega328P (5V, 16 MHz)         ✔ cpu=16MHzatmega328
                            ATmega328P (3.3V, 8 MHz)          cpu=8MHzatmega328
                            ATmega168 (5V, 16 MHz)            cpu=16MHzatmega168
                            ATmega168 (3.3V, 8 MHz)           cpu=8MHzatmega168
オプションとして、動作周波数の設定とマイコン型番の組み合わせが確認できる。
コンパイルやアップロード時に指定するときは以下のようにcpu=を追記する。
            $arduino-cli compile -b arduino:avr:pro:cpu=8MHzatmega328  test

その後、Ubuntu20.04をインストールしたRaspberry pi4でも64ビットバイナリで同じように構築できた。    
CUIの良いところは、非力な環境でも使えること。Pi zeroやPocketBeagleでも実行できるので、SSH接続で書き換えられる超ミニマムな開発環境となった。Arduinoレベルでも開発環境の整備って大変なので、VMイメージやddしたSDカードイメージとして管理できるのは楽。

PocketBeagleを組み込んだボード 
性能はPi Zeroとだいたい同じだがCortex-A8。アーキテクチャがオープンなのと、I/O用サブコアが混載されているので弄り甲斐がある

2020/04/06

屋外受信局の設備更新



 屋外にRaspberrypi2を設置してから、もう4年が経過していた。そんなに負荷をかけてないからか、SSHで定期的にメンテしていたけどSDカード不良になることもなくSDR鯖として動いてくれた。
 いままでの屋外BOXは入れ物の選択、構造、気象対策については問題なかったといえるけれど、小さくてコネクタも増設できず、ちょこっと試したい装置を取り付けるにしても取り回しが悪かった。なので今回は箱を大型化し、不満点の解消に努めた。

  • 設置性やコネクタ回りのハンドリングを改善
  • イーサネットHUBを設置
  • 外部装置への電源分配機能
  • 余ったスペースにボードコンピュータを設置

ボックス回り

AC100Vラインは屋外用の防水延長ケーブルをそのまま箱に導くので、延長コードの先が防水容器になった形。
 コンセント部はキャップ構造になっており、やや小さい外形でボックスに穴加工すれば、押し込むことで容易には引っこ抜けない構造になる。
 内部のACタップの配線を固定したあとで、ボックスとコンセント部の隙間はシリコンコーキングで充填する。

タカチのBOXは内部のベースプレートも一緒に購入して、ここに穴をあけてタイラップで様々な部品を固定することにする。
 内部の部品、ケーブルの設置基準は、簡単にベースプレートを取り外せること。(防水性にかかわる部品を除く)

縦置きとなるので、ケーブルは直下から取り出す。
 下部のどこかにベントホールを設けておく。 完全密閉状態だとプラケースということもあり、一度侵入した湿気が逃げられず、気温変化の激しい日に内部が結露して故障する。
 穴の場所は重力で水が抜けるような位置かつ、暴風雨で雨水が逆流しないような構造が良い。 ベースプレートの裏側などはおすすめ。設置場所によっては虫などの侵入を許すこともあり気を遣う。

足は屋外用マグネットベースにしたので、仮置きでもある程度固定できるようになった。

 電源回り

 ACアダプタまでは既製品の組み合わせで固めた。内部は短い延長コードと、USB電源付きの小型コンセントタップを設置。
 限られた容積を有効活用できるような配置にする。



 コンセントタップの5V電源は小型イーサネットハブとRaspiに供給する。24Vは外部用電源として疑似PoE基板につなぐ。
 屋外設置で真っ先にダメになりやすいのは電源部だったので、交換しやすくしておくことが重要。

 ネットワーク回り

単純に今まで屋外に這わせていたLANケーブルを接続し、内蔵したハブ経由で分配するようにした。ハブは5Vで動作するモバイル用のものを選定。発熱や電磁波放射は抑えたいので100Mbpsで妥協している。

ケーブル回り

 ちゃんとした防水コネクタもあるけれど、ペアで1ポート1万円程度はする。ケーブル側も径や防水性能について細かな確認検討が必要なのでちょっと手に余る。
 高級コネクタであってもなくても、設置場所を考えてなくて他所から水が伝わって腐食する事例、自己融着テープの巻き方ひとつで水の侵入を許してしまったりする事例がある。自然との闘いは知識と想像力、設計における継続的なトライ&エラーになる。

 今回は取り回しやすさ優先で行くので、ケーブル内外は短いLANケーブルを作成し、ケーブルグランドで防水処置とする。外に出たコネクタは、接続先のケーブルと中継アダプタで接続し、その後自己収縮チューブなどで防水処理する。 IP監視カメラの施工でよく使われる方式。
 今回はケーブルが通る程度の太さのケーブルグランドを使うので、通したあとでコネクタをカシメる必要がある。 取り回しや仕上がりを気にしないなら、コネクタごと通る大きめの穴を開け、防水粘土で埋めるほうが楽かもしれない。

 Raspi回り

防湿処理風景

今回はRaspi3Aを選択。 3Bでもよいのだが、あえてUSBハブにすることでUSB端子のレイアウトに自由度が増す。 基板の取り付け方向と垂直にコネクタを出す基板を作ろうかな…。
 Raspi2には発熱が少ないという利点があった。3は外気温15℃でCPU温度が35℃台と普段から高め。ギリギリ許容範囲だろうけれど、4は待機電流が大きすぎるのでヒートシンクと強制空冷が必須になるだろう。
 発熱は悪いことばかりではない。3月末に着雪があり、ちょっとした降雪試験になった。特に問題は起きなかったけれど、降雪中のCPU温度は20℃以下に下がっていた。
 着雪はある程度熱源があればすぐ落雪するので、積もった雪が凍って箱にダメージとなるのをある程度防いでくれる。


固定部を作り直した クロスダイポール

2020/03/05

UMPCもどきの製作3 構造のくみ上げ


UMPCもどきの2つ目の制作記事からまた半年が過ぎた。

 その間に、RaspberyPi4が国内入手できるようになっていた。が、電力設計などでまだ扱いづらいところがある。アイドル状態で結構温かくなるサードパーティーのヒートシンクを触っていると、専用のPMICが無いRaspiの弱点が目立ってきたように感じる。

 今回はBT接続の小型キーボードのデッドストック品の入手をきっかけとして、唐突にWaveShareのHDMI接続5.5インチOLEDモジュール(Raspi3用)のフレームを作成した。
 その流れを生かし、ハンドヘルド端末として骨組み構造をプロトタイプしてみた。

始まり

 中古で手に入れたキーボードはエレコムのTK-GMFBP029BKという製品。 日本語46キー配列。2012年にiPhone向けの英語配列モデルと同時に展開され、手持ちでライトなチャット入力用途とされていたもの。電源は単四電池x2なので経年劣化は無い。
 これが5.5インチOLEDディスプレイと横幅がぴったりだったので、フレームをつくってハンドヘルド端末を組み立ててみることにした。

5.5インチ HDMI液晶について

 手持ちの5.5インチディスプレイはHDMI接続、かつタッチ部はUSBなので接続対象を選ばないが、基板に直に組み付けられるのはRaspi3系統だけとなる。今確認すると、   Raspi4にも対応し、ケース付きになっている後発品も併売されている。

3Bと4Bを買えばすぐわかるけれど、両者はHDMI端子もだが、LANとUSBコネクタの配置まで異なっており、3B用のHDMI液晶キットは4Bではそのままだと使えないので、購入時には注意だ。

https://www.waveshare.com/product/displays/lcd-oled/lcd-oled-1/5.5inch-hdmi-amoled-with-case.htm
拡散されるとは思ってなかった写真

 フレーム側面にキーボードについていた展開式カバーを模擬した固定ヒンジを設けた。
フラットなキーボード端末を目指していたので、特に折り畳み機構は設けなかった。 バッテリ位置と基板の拡張性を考慮しなければ、PSIONのハンドヘルド端末ライクな形態もとれると思う。 

ディスプレイ部のフレームの横幅は144㎜で、幸運にもAdventurer3で出力できるぎりぎりの大きさだった。このサイズはベッドの僅かな傾きで四隅のうちのどこかの食いつきが悪くなり、一つの隅だけ剥がれて反り上がりが発生しやすい。そのため、1層目の品質を見ながら高さ調整を繰り返すことになった。
 このままでもいいけれど、バッテリを内蔵して持ち運びできるようにしたい。ということで、フレームにM3のジュラコンスペーサを立て、残りの筐体フレームを設計していった。
3回ほどリビジョンアップした後の形状

底部のフレームも何とか出力に成功。PETGなのでPLAよりは柔軟性がある


 最終的に、底部プレート+バッテリ上部のプレート、ディスプレーフレームの3層構造になった。キーボードは10Whのモバイルバッテリの上に乗っかる形で、自由に角度をつけられるようにした。

 筐体設計で考慮したのは、RaspberryPiの端子アクセスと拡張基板の搭載を邪魔しないこと、ばらばらに分解できること。バッテリへのアクセスも同様に解放されていること。入れ替えが効くよう、あくまでコンポーネントを一つにまとめているだけにとどめている。
手持ちした感覚は良好
造形が気に入っている英語圏の電子辞書とツーショット

 ひとまず形にすると、あれこれ改良点や機能追加が浮かんでくる。 すでに耐衝撃端末のようなバンパーをTPU素材でつくってみようとか、オリジナルキーボードをつけようとか、そういうことばかり考えている。ヒトはなぜハンドヘルド端末に心惹かれるのだろう…と、主語を無駄に大きくしながら、コモディティ化した市場とサイズ制限によるギリギリのスペックゆえに生まれる多様性の儚さに思いを馳せるのであった。