rosserial_arduinoをSTM32F4に対応させてみる

はじめに

rosserialはROSノードと非ROSノードをシリアルで繋ぐ役割を果たせるパッケージとしてよく知られている。ただし、ArduinoノードとしたSTM32F4に公式に対応しておらず、今回はROS melodicベースのArduinoノードとしたSTM32F411CEU6にroseerialを立ち上げてみた。動作確認テストを含むソースコードはGithubに公開を予定している。ソースコードの改修および動作確認に手数かかるため、ROS melodicを除いて、他のROS Distroはまだ確認しておらず、Githubでのコメント、プルリクエスト、フォークについては他の開発者からの情報共有を歓迎する。

ソースコード

すみません、作成中です。

テスト

テスト環境 Arduino V1.8.13 & STM32F411CEU6
rosserial公式サンプルのLED Blinkingをそのまま流用する。一目瞭然なので、説明は割愛する。

参考文献

rosserial melodic-devel branch@Github

0

ロボット・ドローン部品お探しなら
ROBOT翔・電子部品ストア

外部32.768KHzクリスタルからSAMD21クロック設定まで

はじめに

外部32.768KHz水晶発振子からSAMD21クロックを48MHzに設定する手順、ソースをメモにしておく。

設定手順

1. DFLL48Mリファレンスとして使用されるXOSC32Kクロック(オンボード外部32.768Hzクリスタル)を有効にする。
2. XOSC32Kを汎用クロックジェネレーター1として使用する。
3. 汎用クロックジェネレータ1を汎用クロックマルチプレクサ0(DFLL48Mリファレンス)のソースとして使用する。
4. DFLL48Mクロックを有効にする。
5. 汎用クロックジェネレータ0をDFLL48Mに切り替える。
6. CPUのクロックは48MHzで動作する。

ソースコード

下記参考資料から抜粋したソースは以下のとおり。

/* Set 1 Flash Wait State for 48MHz, cf tables 20.9 and 35.27 in SAMD21 Datasheet */
NVMCTRL->CTRLB.bit.RWS = NVMCTRL_CTRLB_RWS_HALF_Val ;

/* Turn on the digital interface clock */
PM->APBAMASK.reg |= PM_APBAMASK_GCLK ;

/* Enable XOSC32K clock (External on-board 32.768Hz oscillator) */
SYSCTRL->XOSC32K.reg = SYSCTRL_XOSC32K_STARTUP( 0x6u ) | /* cf table 15.10 of product datasheet in chapter 15.8.6 */
                       SYSCTRL_XOSC32K_XTALEN | SYSCTRL_XOSC32K_EN32K ;
SYSCTRL->XOSC32K.bit.ENABLE = 1 ; /* separate call, as described in chapter 15.6.3 */
while ( (SYSCTRL->PCLKSR.reg & SYSCTRL_PCLKSR_XOSC32KRDY) == 0 )
{
  /* Wait for oscillator stabilization */
}

/* Software reset the module to ensure it is re-initialized correctly */
GCLK->CTRL.reg = GCLK_CTRL_SWRST ;
while ( (GCLK->CTRL.reg & GCLK_CTRL_SWRST) && (GCLK->STATUS.reg & GCLK_STATUS_SYNCBUSY) )
{
  /* Wait for reset to complete */
}

/* Put XOSC32K as source of Generic Clock Generator 1 */
GCLK->GENDIV.reg = GCLK_GENDIV_ID( GENERIC_CLOCK_GENERATOR_XOSC32K ) ; // Generic Clock Generator 1
while ( GCLK->STATUS.reg & GCLK_STATUS_SYNCBUSY )
{
  /* Wait for synchronization */
}

/* Write Generic Clock Generator 1 configuration */
GCLK->GENCTRL.reg = GCLK_GENCTRL_ID( GENERIC_CLOCK_GENERATOR_OSC32K ) | // Generic Clock Generator 1
                    GCLK_GENCTRL_SRC_XOSC32K | // Selected source is External 32KHz Oscillator
//                  GCLK_GENCTRL_OE | // Output clock to a pin for tests
                    GCLK_GENCTRL_GENEN ;
while ( GCLK->STATUS.reg & GCLK_STATUS_SYNCBUSY )
{
  /* Wait for synchronization */
}

/* Put Generic Clock Generator 1 as source for Generic Clock Multiplexer 0 (DFLL48M reference) */
GCLK->CLKCTRL.reg = GCLK_CLKCTRL_ID( GENERIC_CLOCK_MULTIPLEXER_DFLL48M ) | // Generic Clock Multiplexer 0
                  GCLK_CLKCTRL_GEN_GCLK1 | // Generic Clock Generator 1 is source
                  GCLK_CLKCTRL_CLKEN ;
while ( GCLK->STATUS.reg & GCLK_STATUS_SYNCBUSY )
{
  /* Wait for synchronization */
}

/* Enable DFLL48M clock */  
SYSCTRL->DFLLCTRL.reg = SYSCTRL_DFLLCTRL_ENABLE;
while ( (SYSCTRL->PCLKSR.reg & SYSCTRL_PCLKSR_DFLLRDY) == 0 )
{
  /* Wait for synchronization */
}
SYSCTRL->DFLLMUL.reg = SYSCTRL_DFLLMUL_CSTEP( 31 ) | // Coarse step is 31, half of the max value
                       SYSCTRL_DFLLMUL_FSTEP( 511 ) | // Fine step is 511, half of the max value
                       SYSCTRL_DFLLMUL_MUL( (VARIANT_MCK + VARIANT_MAINOSC/2) / VARIANT_MAINOSC ) ; // External 32KHz is the reference
while ( (SYSCTRL->PCLKSR.reg & SYSCTRL_PCLKSR_DFLLRDY) == 0 )
{
  /* Wait for synchronization */
}

/* Write full configuration to DFLL control register */
SYSCTRL->DFLLCTRL.reg |= SYSCTRL_DFLLCTRL_MODE | /* Enable the closed loop mode */
                         SYSCTRL_DFLLCTRL_WAITLOCK |
                         SYSCTRL_DFLLCTRL_QLDIS ; /* Disable Quick lock */
while ( (SYSCTRL->PCLKSR.reg & SYSCTRL_PCLKSR_DFLLRDY) == 0 )
{
  /* Wait for synchronization */
}

/* Enable the DFLL */
SYSCTRL->DFLLCTRL.reg |= SYSCTRL_DFLLCTRL_ENABLE ;
while ( (SYSCTRL->PCLKSR.reg & SYSCTRL_PCLKSR_DFLLLCKC) == 0 ||
        (SYSCTRL->PCLKSR.reg & SYSCTRL_PCLKSR_DFLLLCKF) == 0 )
{
  /* Wait for locks flags */
}
while ( (SYSCTRL->PCLKSR.reg & SYSCTRL_PCLKSR_DFLLRDY) == 0 )
{
  /* Wait for synchronization */
}

/* Switch Generic Clock Generator 0 to DFLL48M. CPU will run at 48MHz. */
GCLK->GENDIV.reg = GCLK_GENDIV_ID( GENERIC_CLOCK_GENERATOR_MAIN ) ; // Generic Clock Generator 0
while ( GCLK->STATUS.reg & GCLK_STATUS_SYNCBUSY )
{
  /* Wait for synchronization */
}

/* Write Generic Clock Generator 0 configuration */
GCLK->GENCTRL.reg = GCLK_GENCTRL_ID( GENERIC_CLOCK_GENERATOR_MAIN ) | // Generic Clock Generator 0
                    GCLK_GENCTRL_SRC_DFLL48M | // Selected source is DFLL 48MHz
//                  GCLK_GENCTRL_OE | // Output clock to a pin for tests
                    GCLK_GENCTRL_IDC | // Set 50/50 duty cycle
                    GCLK_GENCTRL_GENEN ;
while ( GCLK->STATUS.reg & GCLK_STATUS_SYNCBUSY )
{
  /* Wait for synchronization */
}

参考資料

ArduinoCore-samd | Github

0

ロボット・ドローン部品お探しなら
ROBOT翔・電子部品ストア

PCBをJLCPCBに発注してみた

はじめに

今回は、PCB生産を評判の良いJLC(嘉立創、深せん市)に任せてみたので、お問い合せからPCBが届くまでの経過をメモにしておく。

お問い合せ

英文のサイトに、対応もサイトから英文でLive chat可能、土日含めて何回もリクエストを出してほぼ待たさずにすぐに返事が来る。リクエストへ回答の質も良く、PCBに詳しい、プロの印象を受けた。のちほど自分が注文のオプション設定にミスを犯して向こうエンジニアの経験で自主回避して細心の注意を払っていることが分かった。

発注

1回発注するとあとはスムーズにいくはず、質問があるとすぐ聞けるので大きな支障がなかった。ホームページは使いやすいほうと。今回12cm寸法のPCB 5枚にサイズ16cmのステンシルを1枚依頼した。GerbビュアーがついてUploadのあとで便利に確認できる。ところで、何故かクーポンの使えるところがいないではないかと聞いたら、すぐ「ご迷惑をかけた」と謝った。

生産

16日(金)夕方の発注からステンシルは16日(金)22時頃の開始~18日(日)14時頃、PCBは21日(水)6時頃の完成、約5.3日間かかった。予定の3日間を超えた。以下履歴画面と見ると、生産のプロセス、スケジュール、いま現在のステータスが明確になっている。また、今回は不透明レジストを聞いたら、対応できないと即答してくれた。ごく普通に依頼した。

決済

送料込み4,400円ほど。支払いにJPay、クレジット、Paypalが使える。JPayについては説明を見ると銀行の振込みみたいなので申し込みが必要。

配送

送料の高い順からDHL、SFexpress、ダイレクトメールが選べる。1kgなら2000円未満。今回の配送はDHLを選んで、深せん~香港~届くまで、約5日間かかった。梱包はしっかりしている。

検収

目視検査および回路の動作を確認済み。シルクはセラミックのようにきれいに見えて繊細の表現までできている。

所感

依頼したあとで企業情報を調べてみると大きな工場を持つ企業であることと分かった。電子部品のほとんどは東南アジア生産なので、コストのみならず物流の利便性からみても深せんのほうは都合が良いかもしれない。きちんと生産、技術、社会貢献に注力する企業ならば支持すべきだと思う。同社の部品サイトLCSCは、まだDIGIKEY、MOUSERほど部品が揃っていないのでこれからと期待する。

jlcpcb-order
jlcpcb-order
1+

ロボット・ドローン部品お探しなら
ROBOT翔・電子部品ストア

SAMDへファームウェアを書き込む

はじめに

SAMDへUSB(CMDプロンプト、ターミナル)/J-Link(Amtel Studio)経由でファームウェアの書き込み方を以下に記す。

CMDプロンプトから

以下は書き込みの例、USBポート番号とBIN/HEXファイルのパスを実際に使用中のものを入れ替える。

ubuntu 18.04の場合

sudo /home/ub/snap/arduino/50/.arduino15/packages/arduino/tools/bossac/1.7.0-arduino3/bossac -i -d --port=ttyACM0 -U true -i -e -w -v path_to_sample.bin -R 

windows 10の場合

C:\Users\user\AppData\Local\Arduino15\packages\arduino\tools\bossac\1.7.0-arduino3/bossac.exe -i -d --port=COM5 -U true -i -e -w -v path_to_sample.bin -R 

Amtel Studioから

AS立ち上げ → J-Link接続 → Device Programing → Fuses → Memoriesの順に書き込んでいく。

amtel_studio_bin_fuses
amtel_studio_bin_fuses

amtel_studio_bin_upload
amtel_studio_bin_upload

1+

ロボット・ドローン部品お探しなら
ROBOT翔・電子部品ストア

PCBAをAllpcbに発注してみた

概況

テスト用サンプルを作成することで、品質かねてコストの面から海外PCB生産を試してみたいと思ったので、旧正月休まず営業と宣伝していたAllpcb(Jiepei、捷配)に依頼した。今回はPCBのみならず、試しに部品調達、実装も頼むことにした。

allpcbにpcbaを発注してみた
allpcbにpcbaを発注してみた

ミッション

PCBサイズ5cm x 5cm+、かつMOQが5枚+のハードルから、PCB 5枚大きいサイズPCB 5枚(6cm x 6cm)、小さいサイズPCB 20枚(3cm x 3cm)、面付2枚x2枚、つまり大きいサイズPCBに小さいサイズPCBが4枚入るので、大PCB 5枚=小PCB 20枚と注文した。また、小さいサイズPCB 4枚に部品調達に実装も依頼した。Allpcbが一旦図面、部品調達確認を終えたものの、のち、Allpcb営業から面付のVスロット加工は8cm x 8cm+にしないとできないと、Vスロットの代わりに、0.5mmの穴開けをすると提案した。Allpcb営業曰く回路と外観に影響なしと言い切ったので、今回限り見栄えを犠牲するかもしれないことを覚悟してGo aheadと穴あけ提案を承認した。

これまでの流れ

2月10日にAllpcb営業にWEBメッセージを送って、ユーザ登録を済ませてGerb&BOMファイルをUpload、2月12日旧正月を挟んで、2月19日にAllpcb営業が確認完了、3月2日までに作成完了と伝えて、2月19日にクレジットでお支払いを済ませて、いよいよ生産をスタートさせることに。これで、旧正月を挟んだとはいえ、ほとんど毎日メッセージかメールの往来で生産に必要な図面確認してもらって9日間もかかった。料金は、166.56USDと表示して、実際の支払い+5USD(3%)、カード会社の手数料だろうか。DHL送料は28USDとの見積もりで、クーポン30USDで免除となった。残りのクーポン2USDが破棄か行方不明。

PCBA工程

Allpcb営業が作成したスケジュールは上記添付画像のとおり。

Parts

5日(2月19日~2月25日)、冗長分含む部品代75.80USD。すべての部品の数がPCB図面必要数以上に調達したようで、生産時のムダが発生した際に必要だそうだ。最後余った分を完成品とともに必ず送るように要望した。

PCB

5日(2月19日~2月25日)、製造費用17.00USD。

SMT

2日(2月26日?~2月27日?)、実装費用70.69USD、開始、完成時間がよく分からない。

オーダー~届くまで

今回PCBA生産依頼したものが届くまでの進捗を以下のとおり記録しておくので、ご参考にしてください。

・2月10日(水) 見積依頼、注文オーダー、2月12日(金)旧正月、2月15日(月)旧正月連休明け

→2月19日(金) やっとAllpcb技術が確認完了、2月25日にPCB完了、3月2日に発送の予定が知らせたので、支払い済ませた

→2月25日(木) PCB予定完了日、完了せず、Allpcbに連絡して返事なし

→2月26日(金) 返事なし

→2月27日(土) 再度連絡、2月25日にPCB完了予定だったが、完了せず、部品到着済み、SMT未着手と返事くれた。予定日3月2日の出荷に間に合うか、遅れるならいつ送るか不安、やっと19時19分にPCB Packing完了

→2月28日(日) PCBAに入ったらしい、予定の3月2日出荷に間に合いそう

→3月2日(火) Allpcb営業に本日出荷可能かと確かめると、本日出荷できない、いつ出荷するかわからないと返事してくれた。予定日出荷不能のことを事前予告なし、いきなり出荷しないとの事態になった。再度遅延の理由を聞いたところ、注文が立て込んで生産が追い付かない状況?との回答だった。予定とおりに出荷するようと要望して工場が調整した結果、日暮れ時今夜DHL発送可能との回答あった。

allpcb-message
allpcb-message

→3月3日(水) DHL画面で荷物を検索したところ、Allpcbが荷物データを作成したが、DHLへの引渡しは完了してないと。やはり宣言通りに3月2日(火)に出荷できなかった。クレームを出して早く出荷するよう求めた。13時すぎDHL集荷した。

allpcb_dhl
allpcb_dhl

→3月5日(金) DHL配達予定日。

→3月6日(土) 予定日より1日遅れて、届いた。関税&DHL通関手数料→1900円、制作総額→およそ2万円。早速PCBA=4枚、動作確認していずれも設計通りに動いたので主な目標が達成したとの判断。ステンシルの添付を忘れたみたいなので、別途送付するようと要望した。

pcba_動作確認
pcba_動作確認

→3月8日(月) Allpcb営業はステンシルが工場の判断で破棄したと返事、おかしいと感じた。情報セキュリティへ不安が残る。

結び

注文~届くまでほぼ1ヶ月経った。品質に不安があったが、幸いに動作確認済みなので、今回の制作が目標達成とした。反省として、PCBAよりPCBを発注したほうが良いことが分かった。また海外配送のほうがDHLでも3~4日かかるので、早く作りたいのであれば、国内へ発注したほうが良い。なお、Allpcbの場合、本社と営業は杭州市におき、工場は安徽省のどこかにあるか、外注したためか、キャッチフレーズに書いたように「世界最速生産」は、残念ながら実力を見せられなかった。PCBAの場合、部品が揃わないと長い時間かかるため、国内へ発注か、部品を調達して自社で実装したほうが良いだろう。良いところとしては、価格と、営業は平日、休日にも関わらず連絡すると返事してくれた。日本製含む部品の価格は、中国現地で調達したほうが圧倒的に安い。もちろん正規ルートから購入するのが前提。恐らくほとんどの部品は東南アジアで製造されて、まして大量購買による単価の引き下げが当然なことだ。ステンシルを送ったらお客がSMTを頼まないとか、送料はお客が払うから高いほうを選ぶとか考え方がおかしい、嘘やんと思われた時に大人の辛抱が必要でまだ進化の余地が多々あると感じさせられた。この経験を生かして、これからは評判のよいJLCPCBに発注することに。

関連記事

PCBをJLCPCBに発注してみた

2+

ロボット・ドローン部品お探しなら
ROBOT翔・電子部品ストア