![見出し画像](https://assets.st-note.com/production/uploads/images/94554329/rectangle_large_type_2_16595009ac7212c1266f49c1ef0f8a6d.jpeg?width=1200)
息子のおもちゃバイクを改造して速度調整などできるようにしてみた
息子のおもちゃの電動バイクを改造したため、その内容をまとめました。
背景
息子の2歳の誕生日に、義母(息子にとってはおばあちゃん)よりイタリアのおしゃれスクーターVespaを模したおもちゃの電動バイクをもらいました。
こちらは、息子が最近Youtubeで乗り物系の動画を観ることが多いことから、妻がお願いして買ってもらいました。
他の電動乗り物系玩具と比べ価格もリーズナブルな割に、息子が少々乱暴に扱っても壊れずに頑丈で悪くない商品でした。
ただ、以下のような気になる点もありました。
気になった点
メイン電源がない
メイン電源はあるはずだと思いこみ、段ボールから開梱して説明書も見る前に電源を探したのですが、どこにもありませんでした。
なくてもなんとかなるのかもしれませんが、移動時やパーツの取り付け時など、やはりメイン電源は切りたくなります。ペダルがON/OFFのみで急発進する
こちらのVespa、下図赤丸箇所のペダルを踏みこむことで後輪が回り、走ることができます。
ただし、ペダルを押すとモーターがフル回転、離すと停止といった感じで、速度制御などはできません。
息子(2歳)はしばらく使っていると慣れて乗れるようにはなっていたのですが、毎回発信時に上半身を後ろに持っていかれており、また細い道などは走りづらそうでした。速度メーター部がシールのみで少し安っぽい
全体的にはVespaが再現されていておしゃれなのですが、ライダー目線で一番目に入るここが速度メーター部がシールのみで安っぽく。Vespa速度メーター(写真を撮り忘れ、改造中の写真ですみません)電池残量がわからない
電池残量がわからず、充電タイミングは息子の移動速度から推測するしかない状態でした。
![](https://assets.st-note.com/img/1672483565584-BMOWU29OJA.png?width=1200)
ということで、息子のライド体験をちょっと向上させたく、これらの問題を解決するための改造を行うことにしました。
改造実施
上記問題点に対して、以下のように改造することとしました。
改造方針
「メイン電源がない」の対策
単純に電源スイッチを追加します。
せっかくならバイクっぽく、鍵付きで、回して電源をつけるようにしたく、こちらのキー付きのスイッチを付けることにしました。ON時はキーが抜けなくなるようで、バイクっぽくていい感じです。
「ペダルがON/OFFのみで急発進する」の対策
ペダルの押し込み具合に応じてポテンショメータが動くようにし、ポテンショメータの位置に応じてモーターの回転速度を調整することを考えました。
ポテンショメータの位置はマイコンのAD変換で見て、モータはモータドライブへのPWM入力で調整するようにします。
ポテンショメータはスライド式の以下を使用しました。
モータは1方向のみ回転できればいいので、以下を購入しました。中華製モータードライバ(このようなモジュールがAmazonで簡単に安く手に入るようになっていい時代になりましたね)
(2023/8/16追記)
元々購入していたモータードライバがダイオードやコンデンサも入っていない単純なもので、足で動かした際などの逆起電力でか、FETE壊れてしまいました。そのため、以下の通り、しっかり目のモータードライバに変更しています。
(変更前)
(変更後)
バッテリーは6Vでモーターは30Wのため、電流量としては定格5Aのためこちらのモータドライバで余裕そうです。
![](https://assets.st-note.com/img/1672483719331-ZTQc9eiGab.jpg)
また、マイコンは発売した頃にとりえず2個買ったものの、用途がなく使っていなかったRaspberry Pi Picoを使用。MicroPythonを初めて試す丁度良い機会かとも思い。
「速度メーター部がシールのみで少し安っぽい」、「電池残量がわからない」の対策
シールと同じ大きさの速度メーターをつけるのは大げさかと思い、速度メーター部のシールは残しつつ、ディスプレイ部をLCDに変えることとしました。
※結局改造中にシールの一部が剥がれてしまい、速度メーター部のシールは全て剥がしてしまいましたが。
ここに2の対策でのポテンショメーターの値から速度を表示し、バッテリー電圧をAD変換した結果による電池残量を表示することにしました。
LCDはI2Cで簡単に制御できそうで、価格も安く、大きさも丁度良い以下を購入しました。
中華製LCDディスプレイ。このような安い中国産のモジュールをAmazonで変えるのいい時代になりましね(2回目)
改造経過
まずはばらして現状の配線がどのようになっているか確認したところ、以下のようになっていました。
![](https://assets.st-note.com/img/1672483824812-YPFimRZBrJ.jpg)
最初はどのようになっているのかよく理解できませんでしたが、ペダルが2接点スイッチとなっており、モータのON/OFFや充電中の動作停止などをうまく切り替えているようです。
もしかしたら電気的に実施する際の一般的な方法なのかもしれませんが、機械的な切り替えのみでうまくやるなと思い、勉強になりました。
回路的な改造は以下の通りとしました。
![](https://assets.st-note.com/img/1672483854562-HaE8MKPHQS.png?width=1200)
念のため事前にブレッドボードで試して、Eagleで回路図を書きました(回路図書くほどでもないかもですが、ミスを減らすために)
![](https://assets.st-note.com/img/1672483882647-vIm152R1Ku.jpg)
![](https://assets.st-note.com/img/1672483909572-gqtM9pbsuF.png?width=1200)
![](https://assets.st-note.com/img/1672483931952-jwc7ZPCLUe.png?width=1200)
後は回路も実装し、上記方針通りに改造していきました。
![](https://assets.st-note.com/img/1672483973162-q46C2mXcIH.jpg?width=1200)
![](https://assets.st-note.com/img/1672484008363-w06MuEtN6c.jpg?width=1200)
私がハードの知識・モチベーションに乏しいため、いたる箇所にホットボンドを使用している点には目をお瞑りください…。
プログラムも一応貼ってきます。
初めてMicroPythonでしたが、Pythonの手軽さをマイコンでできて良さそうです。
この程度の単純なプログラムではまだ効果を感じづらいですが、もっと条件分岐が増えたり、サブモジュール化してくるとよりPythonの良さも出てくると感じました。
また、インタプリタ形式で、USB1本でデバッグも楽ちんです。
(電圧は、計算式ではテスターで直接バッテリーを測った値にどうしてもならず、謎の定数の引き算を入れています。ただ結局この後うまくいかず、どこか計算か、接続が間違っています…)
(2023/8/16追記)
バッテリーパーセンテージの計算方法が誤っていたため訂正しました。
from machine import Pin, PWM, ADC
import utime
import ssd1306
#Const definition
DUTY_VAL_MAX = 65535 #16bit
ADC_MAX = 65535 #16bit
#PEDAL_START_ADC_VAL = 32767
PEDAL_START_ADC_VAL = 50000
PEDAL_VAL_RANGE = ADC_MAX - PEDAL_START_ADC_VAL
MOTOR_DUTY_RATE_START = 0.4
MOTOR_DUTY_RATE_MAX = 1.0
MOTOR_DUTY_RATE_RANGE = MOTOR_DUTY_RATE_MAX - MOTOR_DUTY_RATE_START
MAX_BATTERY_VOLTAGE = 7.2
MIN_BATTERY_VOLTAGE = 6.0
BATTERY_ADC_RATE = 1/(1+2.2)
MAX_ADC_VOLTAGE = 3.3
#Pin Assign and setting
motor = PWM(Pin(22))
motor.freq(10000) #10kHz
#Pin(26, Pin.IN)
#Pin(27, Pin.IN)
pedal = ADC(0)
battery_in = ADC(1)
led = Pin(25, Pin.OUT)
sda = machine.Pin(0)
scl = machine.Pin(1)
i2c = machine.I2C(0,sda=sda, scl=scl, freq=400000)
oled = ssd1306.SSD1306_I2C(128, 64, i2c)
oled.text("[Speed]", 10, 5)
oled.hline(14,30,100,1)
oled.vline(14,15,15,1)
oled.vline(39,20,10,1)
oled.vline(64,20,10,1)
oled.vline(89,20,10,1)
oled.vline(114,15,15,1)
oled.text("[Battery]", 10, 35)
oled.hline(14,60,100,1)
oled.vline(14,45,15,1)
oled.vline(39,50,10,1)
oled.vline(64,50,10,1)
oled.vline(89,50,10,1)
oled.vline(114,45,15,1)
oled.show()
while True:
#calculate pedal value
pedal_val = pedal.read_u16()
adl_pedal_rate = (pedal_val - PEDAL_START_ADC_VAL) / PEDAL_VAL_RANGE
if adl_pedal_rate < 0:
adl_pedal_rate = 0
print("pedal:", pedal_val, " after adjustment:", adl_pedal_rate)
#calculate and set motor duty
motor_duty_rate = (MOTOR_DUTY_RATE_START + MOTOR_DUTY_RATE_RANGE * adl_pedal_rate) if (adl_pedal_rate > 0) else 0
motor_duty_val = int(DUTY_VAL_MAX * motor_duty_rate)
motor.duty_u16(motor_duty_val)
print("motor duty rate:", motor_duty_rate, " duty value:", motor_duty_val)
#PLED Update
#clear gage
oled.fill_rect (14,15,100,15,0)
oled.fill_rect (14,45,100,15,0)
motor_duty_int = int(motor_duty_rate * 100)
print("motor duty int:", motor_duty_int)
#draw new speed gage
oled.vline(14,15,15,1)
oled.vline(39,20,10,1)
oled.vline(64,20,10,1)
oled.vline(89,20,10,1)
oled.vline(114,15,15,1)
oled.fill_rect (14,15,motor_duty_int,15,1)
#draw battery voltage
#battery_voltage = battery_in.read_u16() / ADC_MAX * MAX_ADC_VOLTAGE / BATTERY_ADC_RATE
#battery_parcent = battery_voltage / MAX_BATTERY_VOLTAGE * 100
battery_voltage = battery_in.read_u16() / ADC_MAX * MAX_ADC_VOLTAGE / BATTERY_ADC_RATE
battery_parcent = (battery_voltage - MIN_BATTERY_VOLTAGE) / (MAX_BATTERY_VOLTAGE - MIN_BATTERY_VOLTAGE) * 100
oled.text("[Battery]", 10, 35)
oled.text(str(battery_voltage) + "V", 10, 80)
print("battery ADC:", battery_in.read_u16())
print("battery:", battery_voltage, "V ", battery_parcent, "%")
#draw new battery gage
oled.vline(14,45,15,1)
oled.vline(39,50,10,1)
oled.vline(64,50,10,1)
oled.vline(89,50,10,1)
oled.vline(114,45,15,1)
oled.fill_rect (14,45,int(battery_parcent),15,1)
oled.show()
utime.sleep(0.1)
改造後
改造後の写真を張り付けます。見た目的な変化は少ないですが。
![](https://assets.st-note.com/img/1672484158903-CaTUpBaxbZ.jpg?width=1200)
ペダルの踏み具合に応じてモーター速度が変化し、LCDの速度表示も変わる様子。バッテリー残量は計算が誤っており、正しく表示されていません。。全てビス止めした後に気づいたため直す気力もなく。
終わりに
速度調整機能について、2歳児が理解できるかわかりませんでしたが、すぐに乗りこなし、ペダルで速度調整もしていました。子供の吸収能力の高さは恐るべし。
子供が起きている時間はなかなか改造はできないため、子供が寝た後や昼寝時間にちょこちょこやっていき3週間程度かけてようやく完成させました。
バッテリー残量部など、うまくいっていない部分はありますが、元々気になっていた大部分の問題は解消され、個人的には満足です。
また、コンテナ内で眠っていたRaspberry Pi Picoを使用でき、またMicroPythonを試すことができたこともよかったです。
改善ポイント
最後にやり残したこと、もう一度トライするならやりたいことを書いてこの記事は閉じたいと思います。こうして書いてみるとやり残したことが結構ありますね。
エンコーダを付けてフィードバック制御
モーター速度は単純にペダルの踏み具合に応じてPWMで制御しており、電池残量によって同じ踏み具合でも速度が異なる。そのため、エンコーダーを付けてフィードバック制御をすることでバッテリー残量の影響をなくしたい。ギヤがうるさい
小さなバッテリー、モーターでまわしており、減速比が結構高く、モーター回転時のギヤの音が結構する。あまり詳しくないが、もう少し高価なギヤヘッドを使えば音が抑えられる?大人も乗れるように
今回のバイクは説明書に「重量制限25kg」と記載があった。機械構造、モーター的に大人は乗らない方がいいのだろうが、作りとしては結構頑丈なため、モーターなどを変えて大人も乗れるようにしたい。電源OFF時にも充電できるように
今回メイン電源を電池の+6V側を切断して繋げた。結果としてメイン電源を入れた状態でないと充電ができず、配線をし直したい。充電の値が変
今回の時間内では計算がうまくいかず充電残量の表示が正しくないため、直したい。後からプログラム書き換えができるように
バイクは中を開けるためには結構なビスを外す必要があり、プログラム書き換えのためにバイクを再度開くのが億劫となる。Raspberry Pi PicoのUSB口に外から簡単にアクセスできるようにしておけばよかった。