Upgrade to Pro — share decks privately, control downloads, hide ads and more …

はしめてのプログラミングとロボット制御

 はしめてのプログラミングとロボット制御

令和6年度の前期に日本大学工学部で実施して課外講座のスライドです.
micro:bit基板とロボットマックイーンを使ったプログラミングとロボット制御の講座となります.
はじめは,ビジュアルプログラミングに触れますが,pythonを用いた本格的なプログラミングにも触れます.

以下はロボットの動作動画となります.
〇直進
https://youtu.be/eUK3EyYFZiM

〇Uターン
https://youtu.be/EclrwR4X9Jw

〇黒線カウント
https://youtu.be/OQ9yh4BUfFc

〇黒線カウント20本
https://youtu.be/qjy7Ow1J2DM

〇ライントレース(P制御)
https://youtu.be/Rqx1XSkT4SY

〇ライントレース(on,off制御)
https://youtu.be/eDa12ydyMoY

watawatavoltage

July 14, 2024
Tweet

More Decks by watawatavoltage

Other Decks in Programming

Transcript

  1. 何の役に立つのか? 3 1. 実ロボットを扱う経験 ➢ 機械要素(動力学,設計,加工) ➢ 電気要素(モータ,電気回路,電子回路) ➢ 情報要素(プログラミング,アルゴリズム)

    2. Project Based Learning的学習 ➢ 作戦立案(人,お金,設備,納期,何をやるか) ➢ 設計,開発 ➢ デバック ➢ リリース ➢ フィードバック 3. 自分の専門分野への応用 ➢ ロボット開発で得られた部分的な技術の転用や応用 ➢ 期限の設定や作業時間の見積もり等の予測等
  2. プログラム3-ex:変数の演習問題 37 1. XとYとZという変数を作成し,それぞれの変数に X=5, Y=10,Z=0を代入して!. その後,Z=X + Yを演算するプログラムを作成して, 結果を画面に表示させて!.

    2. Xという変数を作成し,X=0で初期化します. Aボタンを押すと,Xの中身を5増やして,画面表示 するプログラムを作って! 3. XとYという変数を作成,それぞれの変数にX=0, Y=0を代入して!その後,Aボタンを押すたびに, Xを1ずつ増やして! そして,Y=X^2を計算し,Yを画面に表示させて!
  3. プログラミング言語「python」 79 • プログラミング言語の一種 • インタープリター言語であり, 一行だけでプログラムの実行が可能. • 初心者が学ぶプログラミング言語でも人気 •

    近年,人工知能やロボットのプログラムに よく使われる. • プログラムは上から順番に実行される. • コメントは「#〇〇〇〇」で記述 • 複数行コメントは「””” 〇〇 “””」 • コメント以外全角文字は使用禁止(スペースも) • タブ(インデント)でプログラムの階層を 記述(違反すると,プログラムエラー)
  4. プログラム1_py:実行順番 87 pythonバージョンだとこうなります. コピペを連続で使うと便利 def on_forever():#ずっと basic.show_number(1)#数を表示 basic.pause(500)#一時停止(ミリ秒) basic.show_number(2)#数を表示 basic.pause(500)#一時停止(ミリ秒)

    basic.show_number(3)#数を表示 basic.pause(500)#一時停止(ミリ秒) basic.show_number(4)#数を表示 basic.pause(500)#一時停止(ミリ秒) basic.show_number(5)#数を表示 pass basic.forever(on_forever) チート
  5. プログラム1-ex1_py 88 マイコンの色んな機能を試しましょう. def on_forever():#ずっと basic.show_icon(IconNames.HEART)#アイコンを表示 basic.pause(500)#一時停止(ミリ秒) music.string_playable("", 150) basic.pause(500)#一時停止(ミリ秒)

    music.built_in_playable_melody(Melodies.DADADADUM)#鳴らす「」 basic.pause(500)#一時停止(ミリ秒) basic.show_number(input.temperature())#数を表示「温度」 basic.pause(500)#一時停止(ミリ秒) basic.show_number(input.compass_heading())#数を表示「方角」 basic.pause(500)#一時停止(ミリ秒) basic.show_number(input.light_level())#数を表示「明るさ」 basic.pause(500)#一時停止(ミリ秒) pass basic.forever(on_forever)
  6. プログラム1-ex2_py 89 def on_button_pressed_a():#ボタンAが押されたとき basic.show_leds(""" . . # . .

    . # # # . # . . . # # # # # # # . . . # """) pass input.on_button_pressed(Button.A, on_button_pressed_a) マイコンの色んな機能を試しましょう.
  7. プログラム1-ex3_py 90 def on_button_pressed_b():#ボタンBが押されたとき basic.show_leds(""" # # # # .

    # . . . # # # # # # # . . . # # # # # . """) pass input.on_button_pressed(Button.B, on_button_pressed_b) マイコンの色んな機能を試しましょう.
  8. プログラム2_py:四則演算 91 マイコンはコンピュータなので, 四則演算できます. def on_forever():#ずっと basic.show_number(1+ 2)#数を表示 basic.pause(500)#一時停止(ミリ秒) basic.show_number(10

    - 6)#数を表示 basic.pause(500)#一時停止(ミリ秒) basic.show_number(6* 4)#数を表示 basic.pause(500)#一時停止(ミリ秒) basic.show_number(32/4)#数を表示 basic.pause(500)#一時停止(ミリ秒) basic.show_number(5^2)#数を表示 basic.pause(500)#一時停止(ミリ秒) basic.show_number(32/5)#数を表示 basic.pause(500)#一時停止(ミリ秒) pass basic.forever(on_forever)
  9. プログラム3_py:変数を使いましょう 92 好きな数字を変数に入れて,実行できます. x = 0 #変数xを0にする A2=2 #変数A2を2にする y

    = 1 #変数yを1にする def on_forever(): basic.show_number(x)#数を表示 basic.pause(500)#一時停止(ミリ秒) basic.show_number(A2)#数を表示 basic.pause(500)#一時停止(ミリ秒) basic.show_number(y)#数を表示 basic.pause(500)#一時停止(ミリ秒) pass basic.forever(on_forever)
  10. プログラム3_3_py:変数を使いましょう 94 このような増やし方もできますね. y = 0 #yを0にする. while True: #while文を使ったずっとの実現

    basic.show_number(y) #数の表示 y = y + 1 #変数yを1だけ増やす basic.pause(1000)#一時停止(ミリ秒) pass
  11. プログラム3:変数を使いましょう 95 ボタンを使って増減させられますね. x = 0 #xを0にする. while True: #while文を使った「ずっと」の実現

    #ボタンAが押されたら if input.button_is_pressed(Button.A): x = x + 1 #変数xを1だけ増やす basic.show_number(x) #数の表示 basic.pause(100) #一時停止(ミリ秒) pass #ボタンBが押されたら if input.button_is_pressed(Button.B): x = x - 1 #変数xを1だけ減らす basic.show_number(x) #数の表示 basic.pause(100) #一時停止(ミリ秒) pass pass
  12. プログラムの制御文法 96 If文else文:もし~なら for文:繰り返し処理 while文:条件を満たしていれば無限ループ x=1 if (x == 1):

    #xの中身が1ならここを実行 basic.show_number(1) pass else: #xの中身が1以外ならここを実行 basic.show_number(0) pass x=0 while (x ==0): #xが0であれば,while文の中を無限ループする. #無限ループから出たい場合,xの値をいじって,xが0でない #状況を作り出す必要がある. basic.show_number(0) pass x=5 for i in range(x): #iを0に初期化して5回繰り返し処理 basic.show_number(i)#iの中身を表示 #処理がすべて終わるときに,iに1を足す pass
  13. プログラム4_1_py:条件分岐を勉強 97 もしブロックを使うと,その条件に 当てはまると中身が実行できる. x = 0 #xを0にする. while True:

    #while文を使った「ずっと」の実現 #ボタンAが押されたら if input.button_is_pressed(Button.A): x = x + 1 #変数xを1だけ増やす basic.show_number(x) #数の表示 pass #ボタンBが押されたら if input.button_is_pressed(Button.B): x = x - 1 #変数xを1だけ減らす basic.show_number(x) #数の表示 pass if (input.button_is_pressed(Button.A) && input.button_is_pressed(Button.B)): x = x + 5 #変数xを5だけ増やす basic.show_number(x) #数の表示 pass pass
  14. プログラム4_2_py:条件分岐を勉強 98 もしブロックを使うと,その条件に 当てはまると中身が実行できる. y = 0 #yを0にする. while True:

    #while文を使った「ずっと」の実現 basic.show_number(y)#数の表示 #ボタンAが押されたら if input.button_is_pressed(Button.A): y = y + 1 #変数yを1だけ増やす if y==3: #もしyが3なら basic.show_string("Hello!")#文字列を表示 pass pass pass
  15. ロボット制御のためのテストプログラム 99 ロボットを前に進めるプログラム モータが正常に動くかどうか確認 #CW: Clockwise 時計回り #CCW: Counter Clockwise

    反時計回り while True:#ずっと #左のモータを正回転で速度50に設定 maqueen.motor_run(maqueen.Motors.M1,maqueen.Dir.CW, 50) #右のモータを正回転で速度50に設定 maqueen.motor_run(maqueen.Motors.M2,maqueen.Dir.CW, 50) pass
  16. ロボット制御のためのプログラム1 101 前へ進んで,Uターンするプログラム while True:#ずっと basic.pause(500) #一時停止(ミリ秒) #両方のモータを動かす maqueen.motor_run(maqueen.Motors.M1, maqueen.Dir.CW,

    50) maqueen.motor_run(maqueen.Motors.M2, maqueen.Dir.CW, 50) basic.pause(500) #一時停止(ミリ秒) #両方のモータを停止させる maqueen.motor_run(maqueen.Motors.M1, maqueen.Dir.CW, 0) maqueen.motor_run(maqueen.Motors.M2, maqueen.Dir.CW, 0) #左のモータを駆動させる maqueen.motor_run(maqueen.Motors.M1, maqueen.Dir.CW, 50) basic.pause(1000) #一時停止(ミリ秒) #両方のモータを動かす maqueen.motor_run(maqueen.Motors.M1, maqueen.Dir.CW, 50) maqueen.motor_run(maqueen.Motors.M2, maqueen.Dir.CW, 50) basic.pause(500) #一時停止(ミリ秒) pass
  17. ロボット制御のためのプログラム2 102 障害物を回避するプログラム x = 10 while True: #超音波センサの値を確認して10cm以上なら停止 if

    (x > maqueen.ultrasonic(0)): #モータ停止 maqueen.motor_run(maqueen.Motors.M1, maqueen.Dir.CW, 0) maqueen.motor_run(maqueen.Motors.M2, maqueen.Dir.CW, 0) pass else: #両方のモータを動かす maqueen.motor_run(maqueen.Motors.M1, maqueen.Dir.CW, 50) maqueen.motor_run(maqueen.Motors.M2, maqueen.Dir.CW, 50) pass
  18. 黒の線を数えるプログラム 103 これで走ります.実行すると,現在と過去の ラインセンサの値を記憶します. XL = 1 XR = 1

    pre_XL = 1 pre_XR = 1 black = 0 basic.pause(1000) #両方のモータを駆動 maqueen.motor_run(maqueen.Motors.M1, maqueen.Dir.CW, 50) maqueen.motor_run(maqueen.Motors.M2, maqueen.Dir.CW, 50) while True: #過去の数値を更新 pre_XL = XL pre_XR = XR #ラインセンサーの値を読み取る. XL = maqueen.read_patrol(maqueen.Patrol.PATROL_LEFT) XR = maqueen.read_patrol(maqueen.Patrol.PATROL_RIGHT) pass
  19. 黒の線を数えるプログラム 104 完成しました.白から黒へ変化する ところをキャッチします. XL = 1 XR = 1

    pre_XL = 1 pre_XR = 1 black = 0 basic.pause(1000) #両方のモータを駆動 maqueen.motor_run(maqueen.Motors.M1, maqueen.Dir.CW, 50) maqueen.motor_run(maqueen.Motors.M2, maqueen.Dir.CW, 50) while True: #過去の数値を更新 pre_XL = XL pre_XR = XR #ラインセンサーの値を読み取る. XL = maqueen.read_patrol(maqueen.Patrol.PATROL_LEFT) XR = maqueen.read_patrol(maqueen.Patrol.PATROL_RIGHT) if (XL != pre_XL):#左のセンサの変化をとらえて if (XL == 0):#さらに,左のセンサが黒だったら black = black + 1 #白から黒への変化をとらえたと認識 pass pass if (black >= 4): #黒線を4本以上キャッチしたら, basic.show_number(black) #両方のモータを停止 maqueen.motor_run(maqueen.Motors.M1, maqueen.Dir.CW, 0) maqueen.motor_run(maqueen.Motors.M2, maqueen.Dir.CW, 0) pass pass
  20. ライントレース制御(ON/OFF制御) 105 上記の3つのルールを組み合わせると #ずっと while True: #左のセンサが黒なら右に曲がる if (maqueen.read_patrol(maqueen.Patrol.PATROL_LEFT)== 0):

    maqueen.motor_run(maqueen.Motors.M1, maqueen.Dir.CW, 5) maqueen.motor_run(maqueen.Motors.M2, maqueen.Dir.CW, 30) pass #右のセンサが黒なら左に曲がる if (maqueen.read_patrol(maqueen.Patrol.PATROL_RIGHT)== 0): maqueen.motor_run(maqueen.Motors.M1, maqueen.Dir.CW, 30) maqueen.motor_run(maqueen.Motors.M2, maqueen.Dir.CW, 5) pass pass
  21. ライントレース制御(P制御) 106 上記の3つのルールを組み合わせると desire = 0 #目標値を設定 Kp = 10

    #制御ゲイン error =0 #誤差 basespeed =30 while True: #ずっと #センサの値取得 LS = maqueen.read_patrol(maqueen.Patrol.PATROL_LEFT) RS = maqueen.read_patrol(maqueen.Patrol.PATROL_RIGHT) sensor = -1*LS + RS #制御用センサ値取得 error = desire - sensor #誤差信号の計算 #P制御の実行 maqueen.motor_run(maqueen.Motors.M1,maqueen.Dir.CW, basespeed - Kp*error) maqueen.motor_run(maqueen.Motors.M2,maqueen.Dir.CW, basespeed + Kp*error) pass
  22. ロボット制御のためのプログラム5 107 隊列走行(ほかの学生と協力しよう!!) そんなに難しくないよ! #制御ゲインの設定 Kp = 2 sensor =

    0 while True: #超音波センサの情報をキャッチ sensor=maqueen.ultrasonic(0) #すべてのモータを動かす maqueen.motor_run(maqueen.Motors.M1,maqueen.Dir.CW, Kp*sensor) maqueen.motor_run(maqueen.Motors.M2,maqueen.Dir.CW, Kp*sensor) pass
  23. プログラムの読みやすさ 108 x = 0 while True: if input.button_is_pressed(Button.A): x

    = x + 1 basic.show_number(x) pass if input.button_is_pressed(Button.B): x = x - 1 basic.show_number(x) pass pass x = 0 #xを0にする. while True: #while文を使った「ずっと」 #ボタンAが押されたら if input.button_is_pressed(Button.A): x = x + 1 #変数xを1だけ増やす basic.show_number(x) #数の表示 pass #ボタンBが押されたら if input.button_is_pressed(Button.B): x = x - 1 #変数xを1だけ減らす basic.show_number(x) #数の表示 pass pass before after