enakata06’s blog

noteに移行しました。https://note.com/enakata06/

息子のおもちゃバイクを改造して速度調整などできるようにしてみた

息子のおもちゃの電動バイクを改造したため、その内容をまとめました。

背景

息子の2歳の誕生日に、義母(息子にとってはおばあちゃん)よりイタリアのおしゃれスクーターVespaを模したおもちゃの電動バイクをもらいました。

ベスパのおもちゃバイク

Amazon | 子供用 電動乗用玩具 Vespa GTS mini H1 ベスパ ライセンス品 補助輪付 乗用バイク 乗り物おもちゃ (グリーン) | 電動乗用玩具 | おもちゃ

こちらは、息子が最近Youtubeで乗り物系の動画を観ることが多いことから、妻がお願いして買ってもらいました。

他の電動乗り物系玩具と比べ価格もリーズナブルな割に、息子が少々乱暴に扱っても壊れずに頑丈で悪くない商品でした。

ただ、以下のような気になる点もありました。

気になった点

  1. メイン電源がない
    メイン電源はあるはずだと思いこみ、段ボールから開梱して説明書も見る前に電源を探したのですが、どこにもありませんでした。
    なくてもなんとかなるのかもしれませんが、移動時やパーツの取り付け時など、やはりメイン電源は切りたくなります。
  2. ペダルがON/OFFのみで急発進する
    こちらのVespa、下図赤丸箇所のペダルを踏みこむことで後輪が回り、走ることができます。
    ただし、ペダルを押すとモーターがフル回転、離すと停止といった感じで、速度制御などはできません。
    息子(2歳)はしばらく使っていると慣れて乗れるようにはなっていたのですが、毎回発信時に上半身を後ろに持っていかれており、また細い道などは走りづらそうでした。
    ペダルの位置
  3. 速度メーター部がシールのみで少し安っぽい
    全体的にはVespaが再現されていておしゃれなのですが、ライダー目線で一番目に入るここが速度メーター部がシールのみで安っぽく。
    Vespa速度メーター(写真を撮り忘れ、改造中の写真ですみません)
  4. 電池残量がわからない
    電池残量がわからず、充電タイミングは息子の移動速度から推測するしかない状態でした。

ということで、息子のライド体験をちょっと向上させたく、これらの問題を解決するための改造を行うことにしました。

改造実施

上記問題点に対して、以下のように改造することとしました。

改造方針

「メイン電源がない」の対策

単純に電源スイッチを追加します。
せっかくならバイクっぽく、鍵付きで、回して電源をつけるようにしたく、こちらのキー付きのスイッチを付けることにしました。ON時はキーが抜けなくなるようで、バイクっぽくていい感じです。

キー付きスイッチ

Amazon.co.jp: uxcell キープッシュボタンスイッチ 2ポジション 2鍵付き NO-OFF 12x29mm 12mm取り付け穴 直径 2個入り : 産業・研究開発用品

「ペダルがON/OFFのみで急発進する」の対策

ペダルの押し込み具合に応じてポテンショメータが動くようにし、ポテンショメータの位置に応じてモーターの回転速度を調整することを考えました。
ポテンショメータの位置はマイコンのAD変換で見て、モータはモータドライブへのPWM入力で調整するようにします。
ポテンショメータはスライド式の以下を使用しました。

スライド式のポテンショメータ

Amazon | uxcell フェーダー可変抵抗器ミキサー B102 B1Kオーム 18 mmストレートスライドポテンショメータ リニアシングルポテンショメータ 調光チューニング用 5個 | 可変抵抗器 | 産業・研究開発用品 通販

モータは1方向のみ回転できればいいので、以下を購入しました。

中華製モータードライバ(このようなモジュールがAmazonで簡単に安く手に入るようになっていい時代になりましたね)

Amazon.co.jp: Anmbest 2個セット DC 5V-36V 15A(最大30A)400WデュアルハイパワーMOSFETトリガスイッチ駆動モジュール0-20KHz PWM調整電子スイッチ制御基板モーター速度制御ランプ輝度制御 : 産業・研究開発用品

バッテリーは6Vでモーターは30Wのため、電流量としては定格5Aのためこちらのモータドライバで余裕そうです。

製品仕様

また、マイコンは発売した頃にとりえず2個買ったものの、用途がなく使っていなかったRaspberry Pi Picoを使用。MicroPythonを初めて試す丁度良い機会かとも思い。

買ったまま家で眠っていたRaspberry Pi Pico

Raspberry Pi Pico - スイッチサイエンス

「速度メーター部がシールのみで少し安っぽい」、「電池残量がわからない」の対策

シールと同じ大きさの速度メーターをつけるのは大げさかと思い、速度メーター部のシールは残しつつ、ディスプレイ部をLCDに変えることとしました。
※結局改造中にシールの一部が剥がれてしまい、速度メーター部のシールは全て剥がしてしまいましたが。
ここに2の対策でのポテンショメーターの値から速度を表示し、バッテリー電圧をAD変換した結果による電池残量を表示することにしました。
LCDはI2Cで簡単に制御できそうで、価格も安く、大きさも丁度良い以下を購入しました。

中華製LCDディスプレイ。このような安い中国産のモジュールをAmazonで変えるのいい時代になりましね(2回目)

Amazon.co.jp: KeeYees OLEDモジュール OLED LCDディスプレイ 0.96インチ I2C IIC 128X64 SSD1306 4ピン 青 ブルー 3個入り : 産業・研究開発用品

改造経過

まずはばらして現状の配線がどのようになっているか確認したところ、以下のようになっていました。

回路図のメモ(汚いメモですみません)

最初はどのようになっているのかよく理解できませんでしたが、ペダルが2接点スイッチとなっており、モータのON/OFFや充電中の動作停止などをうまく切り替えているようです。

もしかしたら電気的に実施する際の一般的な方法なのかもしれませんが、機械的な切り替えのみでうまくやるなと思い、勉強になりました。

回路的な改造は以下の通りとしました。

回路改造イメージ

念のため事前にブレッドボードで召して、Eagleで回路図を書きました(回路図書くほどでもないかもですが、ミスを減らすために)

事前接続テスト

マイコン周りの回路図

マイコン周りの回路図

後は回路も実装し、上記方針通りに改造していきました。

マイコン・モータドライバの取り付け

LCDの取り付け

私がハードの知識・モチベーションに乏しいため、いたる箇所にホットボンドを使用している点には目をお瞑りください…。

プログラムも一応貼ってきます。

初めてMicroPythonでしたが、Pythonの手軽さをマイコンでできて良さそうです。

この程度の単純なプログラムではまだ効果を感じづらいですが、もっと条件分岐が増えたり、サブモジュール化してくるとよりPythonの良さも出てくると感じました。

また、インタプリタ形式で、USB1本でデバッグも楽ちんです。

(電圧は、計算式ではテスターで直接バッテリーを測った値にどうしてもならず、謎の定数の引き算を入れています。ただ結局この後うまくいかず、どこか計算か、接続が間違っています…)

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.6
MOTOR_DUTY_RATE_MAX = 1.0
MOTOR_DUTY_RATE_RANGE = MOTOR_DUTY_RATE_MAX - MOTOR_DUTY_RATE_START
MAX_BATTERY_VOLTAGE = 7.2
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)
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
    oled.text("[Battery]", 10, 35)
    oled.text(str(battery_voltage) + "V", 10, 80)
    
    #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,motor_duty_int,15,1)

    oled.show()

    utime.sleep(0.1)

改造後

改造後の写真を張り付けます。見た目的な変化は少ないですが。

メイン電源を追加。簡単で一気にバイクっぽさが増す、コスパの良い改造。

youtu.be

ペダルの踏み具合に応じてモーター速度が変化し、LCDの速度表示も変わる様子。バッテリー残量は計算が誤っており、正しく表示されていません。。全てビス止めした後に気づいたため直す気力もなく。

終わりに

速度調整機能について、2歳児が理解できるかわかりませんでしたが、すぐに乗りこなし、ペダルで速度調整もしていました。子供の吸収能力の高さは恐るべし。

youtube.com

子供が起きている時間はなかなか改造はできないため、子供が寝た後や昼寝時間にちょこちょこやっていき3週間程度かけてようやく完成させました。

バッテリー残量部など、うまくいっていない部分はありますが、元々気になっていた大部分の問題は解消され、個人的には満足です。

また、コンテナ内で眠っていたRaspberry Pi Picoを使用でき、またMicroPythonを試すことができたこともよかったです。

改善ポイント

最後にやり残したこと、もう一度トライするならやりたいことを書いてこの記事は閉じたいと思います。こうして書いてみるとやり残したことが結構ありますね。

  1. エンコーダを付けてフィードバック制御
    モーター速度は単純にペダルの踏み具合に応じてPWMで制御しており、電池残量によって同じ踏み具合でも速度が異なる。そのため、エンコーダーを付けてフィードバック制御をすることでバッテリー残量の影響をなくしたい。
  2. ギヤがうるさい
    小さなバッテリー、モーターでまわしており、減速比が結構高く、モーター回転時のギヤの音が結構する。あまり詳しくないが、もう少し高価なギヤヘッドを使えば音が抑えられる?
  3. 大人も乗れるように
    今回のバイクは説明書に「重量制限25kg」と記載があった。機械構造、モーター的に大人は乗らない方がいいのだろうが、作りとしては結構頑丈なため、モーターなどを変えて大人も乗れるようにしたい。
  4. 電源OFF時にも充電できるように
    今回メイン電源を電池の+6V側を切断して繋げた。結果としてメイン電源を入れた状態でないと充電ができず、配線をし直したい。
  5. 充電の値が変
    今回の時間内では計算がうまくいかず充電残量の表示が正しくないため、直したい。
  6. 後からプログラム書き換えができるように
    バイクは中を開けるためには結構なビスを外す必要があり、プログラム書き換えのためにバイクを再度開くのが億劫となる。Raspberry Pi PicoのUSB口に外から簡単にアクセスできるようにしておけばよかった。