11月25日発売 書籍『Arduinoと3Dプリンタでロボットを作ろう』を出させて頂きました!

【電子工作】Arduinoを使った無線コントローラー(送信機)製作ノート②!Arduinoや他のマイコンボードでも使える便利な無線コントローラーです!【nRF24L01/JLCPCB】

Arduinoはマイコン初心者の方でも扱いやすいように作られたよく出来たマイコンボードです。

そして何かしらのトラブル等発生した場合でも世界中には多くのArduino Loveな方々がいるので非常に多くの情報が公開されており、ネットを調べれば大抵のことは解決することが出来ます。
ESPなどの後発となるマイコンボードと比べてこの情報量の多さはArduinoを使った電子工作の魅力の一つでもあります。

そんな電子工作やマイコン初心者の方でも扱いやすく楽しむことが出来るArduinoなんですが、ESPなどのマイコンボードと比べると標準でWi-FiやBluetoothといった無線機が搭載されていません。(一部搭載されているボードもありますが)
そのためArduinoで無線機能を使いたい場合、それらに対応したモジュールを外部接続する必要が出てきます。

Arduinoを使った電子工作を進めていくと、いろんな製作物を作るようになるかと思います。
私もこれまでいろいろと作りましたが、それら製作物を操作する際に送信機(コントローラー)があると非常に便利となります。

以前はこのようなジョイスティックが付いたシールドに無線モジュールを接続して操作していました。

Arduinoはこのような便利に使えるシールドが多数販売されているのもマイコン初心者にはありがたく、人気がある理由の一つだと思います。

【Arduino】ジョイスティックシールドを使ってみる!無線モジュール(nRF24L01)とのコンビで便利に使えます!

上記のようなジョイスティックシールドがあれば製作物を操作する際に便利に使えるのですが、例えばこのようなロボットを動かす場合では割り当てられるスイッチの数が少し少なすぎます。
また他の製作物で使う場合にコントローラー側のプログラム(スケッチ)もそれに対応したものを作る必要が出てきます。

それならコントローラーとして想定できる機能をすべて盛り込み、操作する対象が変わっても送信機側のスケッチは統一して使えるものがあれば便利だな・・・なんて事を前々から思っていました。

そして最近KiCadを使った基板設計の勉強も始めたのですが、基板製作が出来るようになりこれをようやく実現することが出来ました。

前回、このArduino無線コントローラーを製作した経緯や基板設計などの話を中心にご紹介しました。
こちらの記事も合わせて見て頂ければと思います。

【電子工作】Arduinoを使った無線コントローラー(送信機)製作ノート①!KiCadの基板設計から基板発注(JLCPCB)までの話(nRF24L01)

そしてSNSは主にInstagramをやっているのですが、多くの方から基板データやスケッチ等を共有して欲しいといったコメントやお問い合わせを頂きました。
基板設計に関してはまだ始めたばかりの初心者なので、かなり時間をかけて動作チェック等行い問題がないようなので公開したいと思います。

そんな事で今回は、nRF24L01無線モジュールを使ったオリジナルのArduino無線コントローラーを製作した話の続きとなります。

Arduinoを使った無線コントローラー(送信機)の製作!(nRF24L01)

どんな無線コントローラーなのか?

まずどんな無線コントローラー(送信機)なのかを簡単にご紹介しておきます。

コントローラーの制御にはArduino Nanoを使い、nRF24L01無線モジュールを使って各スイッチポジションを送信する構成となっています。

nRF24L01無線モジュールは接続が非常に早いのでこのようなコントローラーの製作には最適ですが、日本では技適が取得されていないモジュールなのでその使用には注意が必要です。

nRF24L01無線モジュールに関してはこちらの記事も参考にして下さい!

【電子工作】無線モジュールnRF24L01を使いArduino間で無線通信をやってみる!
MEMO
nRF24L01に関しては技適の問題があるのでその使用には注意が必要です!

操作スイッチとして左右2つのジョイスティック・トグルスイッチ・ポテンショメーター、そして4つのタクトスイッチを使うことが出来ます。

スイッチのON/OFF判定(デジタル入力)が計8チャンネルにジョイスティックとポテンショメーターのアナログ入力が計6チャンネルの合計14チャンネルのデータをnRF24L01無線モジュールで送信する構成となっています。

Arduino Nanoで使えるI/O端子はD0~D13およびA0~A7の計22本ありますが、全てのI/O端子を使ってこれらを実現させています。

各スイッチの状態を確認できるOLEDディスプレイも搭載しています。
またMPU6050加速度センサーを使いコントローラーの傾きを送信して、これを受信側で扱うことも出来ます。

コントローラーはArduino Nanoで制御していますが、受信側にはESP32やESP8266といったESP系のマイコンボードやRaspberry Pi PicoなどArduino以外のマイコンボードを操作することも出来ます。

これだけの操作スイッチが付いているので、状況に応じて割り振ればいろんな製作物を操作する事が出来ると思います。

また、ブレッドボードで何かしらのテスト動作などをしたい場合にジョイスティックやポテンショメーター、タクトスイッチを使うことはよくありますが、接続は簡単ですが多くの配線が必要となり結構面倒な場面が多いと思います。

マイコンボードに受信機としてnRF24L01無線モジュールをSPI接続しておけば、配線も簡略化できテスト環境の効率も上がります。

JLCPCBを使って基板を発注

前回の記事でKiCadを使った基板設計の話をしましたが、このArduino無線コントローラーは私の手の大きさにフィットするサイズ感で基板を設計しています。(比較的手は小さい方です)

基板サイズや押しやすい位置になるように各スイッチやパーツの配置は、Fusion360(3D CADソフトです)を使いモデリングしてからKiCadで基板として仕上げています。
個人的には非常に操作しやすいコントローラーになっているかと思います。

基板データ(ガーバーファイル)はこちらからダウンロード出来るようにしました。
興味ある方や作ってみたいと思われる方がいましたら、ぜひダウンロードして製作してみて下さい。

基板製作なんてやったことがないという方のために、少し基板発注方法に関しても書いておきます。

KiCadを使った基板の設計やPCB製造メーカーさんを使い基板製作依頼を行うようになったのはつい最近なんですが、全く初めての方からしたら非常に難しそうに感じるかもしれません。

私も電子工作という趣味を始めてからオリジナル基板の設計や製作は非常に興味がある項目の一つでしたが、「なんだか難しそう?」や「料金が高そう?」といったイメージから長らく後回しにしていました。

実際にやってみると意外と簡単と言いますか、もちろん回路設計にはそれなりの知識が必要なわけですが、基板の発注自体は非常に簡単です。
そして基板製造料金も驚くほどお安い!

基板の発注は主に海外のPCB製造メーカーさんに基板の製作依頼をするわけですが、JLCPCB(中国の製造メーカーです)ではその中でも非常にコスパの高いメーカーになります。

今回製作したArduino無線コントローラーの基板サイズは、約150mm×80mmとなっています。
製造する基板サイズが標準サイズ(10cm×10cm)を超えると各社一気に製造料金が高くなってしまいます。
数社でこの基板の見積もりを出しましたが、だいたい35~40ドル前後といった価格になると思います。

JLCPCBでは標準サイズを超える基板でも非常にお安く作ることが出来ます。
この基板で言うと基板製作料金は8.9ドルでした。(基板5枚の料金です)
圧倒的に他社より安いですよね!

さらにJLCPCBさんでは海外発送の送料区分も比較的速くて安いOCS Expressを使うことが出来るので、トータルコストは他社と比べ非常に安く製作する事が出来ます。

JLCPCBでの基板発注方法

このArduino無線コントローラーを製作されたい方がいましたら、JLCPCBさんでの発注をおすすめします。

上記ダウンロードした基板データ(ガーバーファイル)はJLCPCBで発注することを前提に追加料金がかからないように少し手を加えています。

JLCPCBでの基板発注方法を簡単に説明しておきます。
以下サイトはJLCPCBの日本語トップページです。
JLCPCBの利用が初めての場合、初回特典クーポンをもらえるので更にお安く製作することが出来ます。

MEMO
[追記2024/03/06]JLCPCBのサイトが日本語に完全対応しました!
参考 JLCPCB日本語トップページJLCPCB

基板製作料金及び送料等の確認は非常に簡単です。(ユーザー登録の必要はありません)
上記日本語トップページのロゴをクリックして本来のJLCPCBサイトのトップページに移動します。
上記ダウンロードしたArduinoコントローラーの基板データ(zip形式)をそのままアップロードすれば確認する事ができます。

基板のサイズ等の確認やプレビューなどユーザー登録無しで行えます。

また基板製作料金および送料の確認も同時に行えます。
為替や決済方法により最終的な価格は若干変わってきますが、基板製作料金が$8.7、発送にOCS Expressを使えば送料が$8.53となり約17ドルで製作出来ます。
他のPCB製造メーカーと比べ圧倒的にお安く作れると思います。

基板製造の設定も少し見ておきます。
基本的にデフォルト設定で問題ありませんが、基板色はお好みの色を選択してくださいね!
私は黒基板で作りましたが他の基板色(レジスト)を選択することも出来ます。(追加料金はかかりません)

あと基板発注時のオーダー番号が任意の場所にシルクプリントされてしまうのですが、追加料金がかからないように基板裏側の目立たない位置に入るようにしています。

[Remove Order Number]の項目は[Specify a location]を選択して下さい。
基板設定は以上です!

あとは実際に発注するわけですが、この時点で住所や支払い方法等のユーザー登録が必要となります。
JLCPCBでの基板発注が初めての方はこちらの記事で詳しく解説しているので合わせて読んで頂ければと思います。

【電子工作】はじめての基板製作!JLCPCBさんに基板を発注してみました。ユーザー登録・データ納品・基板到着までの一連の流れをご紹介!

電子パーツ一覧

こちらが製作に必要なパーツ一覧です。

特殊なパーツは使っていませんが、ジョイスティックやトグルスイッチ、スライドスイッチなどサイズが合わないと基板に取り付け出来ないものもあるため詳しく紹介しておきます。(リンク先のページでパーツのサイズ等の確認を行って下さい)

電子パーツ個数
Arduino Nano1
nRF24L011
ジョイスティック2
トグルスイッチ2
ポテンショメーター2
タクトスイッチ(6mm×6mm×17mm)4
スライドスイッチ1
OLEDディスプレイ(0.96inch)1
MPU60501
圧電スピーカー(12mm)1
AMS1117-3.31
電解コンデンサ(10μF/100μF)各1
LED1
抵抗(330~1kΩ程度)1
18650バッテリーボックス1
2ピンXH端子(またはPH2.0など)1
4ピンピンソケット1

Arduino Nano ×1

Arduino NanoのUSB端子は、本家ボードや多くの互換ボードではminiUSB端子となっています。
今回使ったArduino Nano互換ボードはType-C端子になった互換ボードを使いました。
特にUSB端子の形状は問題にはなりませんが、Type-C互換機は国内サイトでは入手しにくいので海外サイトから入手しました。

nRF24L01 ×1

nRF24L01無線モジュールはAmazonなどでも入手しやすいので問題ないと思います。

ジョイスティック ×2

ジョイスティックはX方向・Y方向そして押し込み操作が出来るアナログタイプのものを使っています。
PS4対応のものでサイズを合わせています。

ジョイスティックカバー(クッション)は、あまりセット販売されていないようですが、電子工作用途でよく使われるこのようなモジュール形状になったジョイスティックをお持ちなら外して使うことが出来ます。(ジョイスティック本体のサイズは異なります)

トグルスイッチ ×2

3ピンタイプのミニトグルスイッチです。

ポテンショメーター ×2

抵抗値はあまり問題ではありませんが20kΩのポテンショメーターを使っています。

タクトスイッチ(6mm×6mm×17mm) ×4

6mm角のタクトスイッチを4つ使っています。
操作しやすいように17mm高のものを使っています。

スライドスイッチ ×1

電源ON/OFF用のスイッチです。
SS12D06という型番の1回路2接点タイプのL型スライドスイッチです。

OLEDディスプレイ(0.96inch) ×1

0.96インチ 解像度128×64のOLEDディスプレイを使っています。
I2C接続タイプのSSD1306ドライバ駆動タイプのものを選んで下さい。

MPU6050 ×1

三軸ジャイロ&加速度センサーにMPU6050を使っています。
I2C接続タイプのものです。

圧電スピーカー(パッシブブザー) ×1

12mmサイズのパッシブブザーを1つ使っています。

AMS1117-3.3 ×1

3.3Vレギュレータに表面実装タイプのAMS1117-3.3を使っています。
nRF24L01駆動用の電源となります。

電解コンデンサ ×2

上記レギュレータまわりに10μFと100μFの電解コンデンサをそれぞれ1つ使っています。

LED×1 & 抵抗×1

電源ランプLEDです。
電流制限抵抗として470Ωのものを使っていますが、300Ω~1kΩあたりの抵抗を入れておけば問題ありません。

18650バッテリーケース

この無線コントローラーの駆動電圧は7~12Vとなっています。
18650リチウムイオン電池(2本)を使って駆動させています。
ボトムプレート(3Dプリントパーツ)にバッテリーケースを固定する形で使用します。

18650 2本 バッテリーホルダー 電池ボックス リードハーネス付き
Cirsaeur

2ピンXH端子(またはPH2.0端子など) ×1

バッテリーボックスのケーブルを2ピンのXH端子を使い基板と接続しています。
端子の形状は2.54mmピッチならJST-PH2.0端子などお好みで選択して下さい。
また基板にケーブルを直付けではんだ付けしても問題ありません。

4ピンピンソケット

OLEDディスプレイを10mm嵩上げする際に必要となります。

その他パーツ

M3ビス & スペーサー

ボトムプレートと基板との固定にM3ビス(5mm程度)が8本とスペーサーが4本必要となります。
固定用のビスは5mm以上あれば長さは問題ありません。
またスペーサーの長さでコントローラーを好みの厚みに調整して頂ければと思います。

M2ビス & スペーサー

OLEDディスプレイの固定にM2ビス(4本)とM2×10mmスペーサー(2本)を使います。

インサートナット(M3サイズ高さ5mm)

ボトムプレートに18650電池ボックスを固定するためのインサートナットです。(M3ビス用高さ5mm×2個)

基板の組み立て

特殊なパーツは使っていないので、はんだ作業はそれほど難しくはないと思います。

ディスプレイの取り付けは操作しやすいように4ピンピンソケットを使い10mm嵩上げしています。
ピンソケットの10mm分嵩上げされるので、ディスプレイの固定にM2×10mmのスペーサーを使えば安定します。

この嵩上げ分、周りにある4つのタクトスイッチも高さ17mmサイズのものを使いました。

ポテンショメーターの取り付けは、このようにピンヘッダーを上手くはんだ付けして基板に取り付けて下さい。

18650バッテリーボックスからの配線と基板との接続には2ピンのXHコネクタを使いました。
2.54mmピッチなら他の端子でも問題なく、またワイヤーを直付けで基板にはんだ付けしても問題ありません。

ボトムプレートの製作

18650バッテリーボックスを固定するためのボトムプレートはThingiverseにアップしています。
こちらからダウンロードして使って下さい!

参考 Arduino Wireless Controller Bottom PlateThingiverse

電池ボックスを内側または外側に固定する2パターンのプレートがあります。

お好みで使って頂ければと思います。

ボトムプレートにM3(5mm高)のインサートナットを仕込み、バッテリーケースとの固定はM3平頭ネジ(3mmほど)を使えば綺麗にマウントできます。(外側固定タイプのボトムプレートは5mm厚で作っているのでインサートナットが貫通します)

基板との固定にM3ビス(5mm以上のもの)とM3スペーサーを使います。
スペーサーの長さは、使用するボトムプレートと手のサイズによって使いやすい厚みは変わってくるかと思います。
私は上記写真のように電池ボックスは内側に入れ25mmのスペーサーを入れて現在使っています。

送信側・受信側 テストスケッチ

コントローラーが完成したらテスト動作させてみます。
送信側(コントローラー側)・受信側のテストスケッチはこちらからダウンロード出来ます。
テスト動作で使って下さい。

MEMO
複数ライブラリを使っています。
必要なライブラリのインストールもお忘れなく!

受信側スケッチはnRF24L01無線モジュールのCE/CSN端子はArduinoのD9/D10端子を使っています。(スケッチで変更可能です)
PCと接続する受信側ArduinoとnRF24L01との接続はこのようになります。

nRF24L01無線モジュールの接続や使い方等に関して詳しくはこちらの記事も参考にして下さい!

【電子工作】無線モジュールnRF24L01を使いArduino間で無線通信をやってみる!
【電子工作】nRF24L01無線モジュールを安定動作させるための方法!

コントローラーの各スイッチを動かしてシリアルモニタで全てのチャンネルの状態を確認する事が出来れば成功です。

送信側(コントローラー側)のスケッチは他の用途でも共通して使えると思うので基本的には変更する必要はないと思います。
動かす対象により上記受信側テストスケッチをベースに変更して使って頂ければと思います。

MEMO
受信側スケッチは無線接続が1秒以上途切れると全てのスイッチポジションをノーマルの位置(スイッチはOFF/アナログ入力は512)になるようにしています。
暴走等防止のためです!

実際に使ってみる!

上記テストスケッチを動かして問題なければ、製作物等で便利に使えると思います。
これまで製作したものたちで、いろいろと試してみました。

上記テストスケッチはArduino間での送受信を想定したものですが、受信側のスケッチを一部修正すればESP32など他のマイコンボードも動かすことができます。

また製作物を動かす以外にもブレッドボードでタクトスイッチやポテンショメーター、ジョイスティックを使ったテストや確認などでも使うことが出来ると思います。
受信側のマイコンにSPI接続でnRF24L01を繋ぐだけで面倒な配線が必要なくなります。

スケッチ解説

簡単にスケッチの解説と言いますか、各スイッチポジションで使われている変数だけ見ておきます。

nRF24L01無線モジュールは一度に最大32バイト分のデータを送信する事が出来るのですが、スイッチポジションで扱う変数の数が多いので構造体を使って宣言しています。

送信側スケッチで以下の順に各スイッチポジションを変数に格納してデータの送信を行っています。
受信側も同様にデータを順に受信して以下変数に格納しています。

変数の型変数名内容取得する値
intdata.Joy1_X左ジョイスティックのX方向の傾き0~1023
intdata.Joy1_Y左ジョイスティックのY方向の傾き0~1023
intdata.Joy2_X右ジョイスティックのX方向の傾き0~1023
intdata.Joy2_Y右ジョイスティックのY方向の傾き0~1023
bytedata.Joy1_SW左ジョイスティックのON/OFF1 or 0
bytedata.Joy2_SW右ジョイスティックのON/OFF1 or 0
bytedata.Toggle1_SW左トグルスイッチのON/OFF1 or 0
bytedata.Toggle2_SW右トグルスイッチのON/OFF1 or 0
bytedata.SW_AタクトスイッチAのON/OFF1 or 0
bytedata.SW_BタクトスイッチBのON/OFF1 or 0
bytedata.SW_CタクトスイッチCのON/OFF1 or 0
bytedata.SW_DタクトスイッチDのON/OFF1 or 0
intdata.Pot1左ポテンショメータの値0~1023
intdata.Pot2右ポテンショメータの値0~1023
floatdata.degXコントローラーのX方向の傾き0~359.99°
floatdata.degYコントローラーのY方向の傾き0~359.99°

例えばタクトスイッチAの状態が知りたい場合、data.SW_Aという変数を読めば分かるということです。

Arduino間での送受信を想定して、Arduinoで一般的に使われる変数の型(intやbyte)などを使っています。
受信側のマイコンがArduino以外、例えばESPなど他のマイコンボードを使いたい場合、受信側または送信・受信ともに変数の型を変更する必要があります。

Arduinoではint型では符号付きの整数が扱われ2バイトを使って格納されます。
またbyte型なら1バイト、float型なら4バイトといった具合です。
他のマイコンボード、例えばESP(ESP32/ESP8266)ではint型は4バイトで扱われるなど仕様が異なっています。

他のマイコンボードで使いたい場合は、以下受信側スケッチの構造体の宣言部分の変数の型をこのように変更する必要があります!

・byte → uint8_t(符号なし1バイト)
・int → int16_t(符号付き2バイト)

に変更すれば使うことが出来ます。
あとは各マイコンボードのSPI端子にnRF24L01無線モジュールを接続すれば、異なるマイコン間でもデータの送受信を行うことが出来ます。

最後に!

Arduinoを使った製作物はこれまでいろいろと作ってきましたが、このようなコントローラーが一台あると送信側のスケッチは共通で受信側のスケッチのみ変更すれば動かすことが出来るので便利だと思います。

上記の送信側・受信側テストスケッチは、送信側はデータの送信のみ受信側は受信のみを行うスケッチとなりますが、nRF24L01無線モジュールは送受信にも対応しているので、例えば受信側のセンサー情報をコントローラーのディスプレイに表示させるなどのカスタマイズも可能です。

基本的にコントローラー側のスケッチは共通して使えるようにしていますが、製作物によってはコントローラー側のスケッチも修正して使うと幅広い用途で使えると思います。

ディスプレイのグラフィックを作り込むのは結構時間がかかりますが、メニュー切り替えでこのようなスティックポジションを表示させてみるのも面白そうですね!

コメントを残す