Raspberry Pi 筆記(14):用鍵盤透過無線網路控制智能車

在學習Arduino的時候,一直想要組一部智能小車,可以透過藍牙或紅外線遙控,可是礙於車體壓克力版、車輪等問題,想要自己製作,又沒有工具及材料,一直遲遲無法完成。一個多月前在逛光華商場時,看到智能小車的車體套件,包括四個馬達含輪子及一個壓克力版車體,價格有貴一點點,還是買了,想說之前購買的L298N電機馬達驅動模組及電池盒,應該就可以組合起來讓小車行走。在組合之前還是要改裝一下,主要是我買的L298N只能控制兩組馬達,因此將前面兩個輪子改裝成可360度旋轉的單輪,這個材料是在Homebox買的。
過程中為了讓車子的能離開電源插座,特別外接一個小的行動電源,增加車輛的移動性。同時也使用USB無線網路,才能透過遠端登入的方式,使用鍵盤控制車輛的前進、倒退與左右方向。以下就來看看我是怎麼做的:


基礎知識:L298N機電馬達驅動模組
L298N採用15腳封裝。主要特點是:工作電壓高,最高工作電壓可達46V;輸出電流大,瞬間峰值電流可達3A,持續工作電流為2A;額定功率25W。內含兩個H橋的高電壓大電流全橋式驅動器,可以用來驅動直流電動機和步進電動機、繼電器線圈等感性負載。
使用L298N驅動電機,可以驅動一台兩相馬達或四相馬達,也可以驅動兩台直流馬達。

這個L298N模組提供5V供電。當+12V輸入電壓為7V-35V時,可以提供供電給 Raspberry Pi的主機板使用。如果+12V電壓輸入7V以下,僅適合用作推動馬達的電壓,Pi主機板的電源,建議另外提供電源使用。

這個模組有2路H橋驅動,可同時驅動兩個馬達,接法如下圖:
Enable A短路連接器連接時可控制IN1、IN2,Enable B可控制IN3、IN4,其意義代表控制馬達轉動的方向。舉例來說,當IN1為高電位,IN2低電位時,通知馬達正轉,如果要反轉時,則讓IN2為高電位,IN1低電位,馬達則會向反方向轉動。如下表:



[材料]

• Raspberry Pi 主板 x 1
• 智能車壓克力板 x1
• 差速馬達  x2
• 360度迴轉軸輪 x1
• L298N電機馬達驅動模組 x 1
• 6V(1.5V x 4)電池盒 x 1個
• 連接線 x 6條
• 行動電源 x 1

[線路連接與電路圖]

• L298N 兩側兩條線路分別接到左右兩邊的馬達
• 電池盒的負極(黑色)接 L298N 接地GND,正極(紅色)接 L298N +12V電源輸入
• Raspberry Pi pin2(+5V)接到L298N +5V電源輸入,pin6(GND)接到L298N GND接地
• Raspberry Pi pin11(GPIO 17)、pin12(GPIO18)、pin15(GPIO 22)、pin16(GPIO23)分別接到IN1~IN4

程式中有個比較特別的地方是我用迴圈並偵測是否按了鍵盤按鍵(不需按Enter)的一個函數getkey(),需要 import curses,也必須設定 stdscr = curses.initscr(),才能透過getey取得鍵盤按鍵。鍵盤控制方式如下:
• q 結束程式
• w 前進
• x 後退
• d 向右轉
• a 向左轉

[程式碼]

import RPi.GPIO as GPIO
import curses
import time
from curses import wrapper

GPIO.setmode(GPIO.BCM)

GPIO.setup(17, GPIO.OUT)
GPIO.setup(18, GPIO.OUT)
GPIO.setup(22, GPIO.OUT)
GPIO.setup(23, GPIO.OUT)

stdscr = curses.initscr()
stdscr.clear()

while True:
    ch = stdscr.getkey()
# Quit 
    if ch == 'q':
       curses.endwin()
       GPIO.output(17, False)
       GPIO.output(18, False)
       GPIO.output(22, False)
       GPIO.output(23, False)
       break

# Forward
    if ch == 'w':
       GPIO.output(17, False)
       GPIO.output(18, True)
       GPIO.output(22, False)
       GPIO.output(23, True)

# Backward
    if ch == 'x':
       GPIO.output(17, True)
       GPIO.output(18, False)
       GPIO.output(22, True)
       GPIO.output(23, False)

# Turn Right
    if ch == 'd':
       GPIO.output(17, False)
       GPIO.output(18, True)
       GPIO.output(22, False)
       GPIO.output(23, False)

# Turn Left
    if ch == 'a':
       GPIO.output(17, False)
       GPIO.output(18, False)
       GPIO.output(22, False)
       GPIO.output(23, True)

[執行結果]


接下來還有些控制智能小車的想法,例如加裝避免碰撞的感應器讓小車自動轉彎、使用網頁操控小車、透過藍牙控制等方法,等有空時,再慢慢來實驗。

12 留言

  1. 你好請教您一下 抱歉我問題比較多 因為很感興趣 ARDUINO 能做出這樣東西嗎 這程式開發環境是ARDUION嗎 程式RUN出來有介面操控 還是直接按鍵盤即可~ 麻煩大大了

    回覆刪除
    回覆
    1. Arduino如果要用無線網路有些困難, 主要是Arduino要能支援USB無線網卡, 目前常見的Arduino R3是沒有支援USB介面, 如果外接擴展版, 還有看有沒有支援網卡驅動程式. 不過, 有一個新的Arduino 主機板, 名字叫做YUN(雲), 是一塊在台灣設計的Arduino, 內建WIFI功能, 應該就可以做到類似這篇文章的馬達控制, 只是要改成C語言。如想瞭解YUN相關資訊,可參考:http://arduino.cc/en/Main/ArduinoBoardYun#.UynIciYVHIU

      上述程式我沒有寫介面, 透過SSH連進去後, 執行程式, 畫面只剩下游標閃爍, 直接按鍵盤進行控制.

      如有相關問題, 歡迎一起討論. 謝謝您的提問!!

      刪除
  2. 您好,請教,我依您所提供的程式碼,執行到ch = stdscr.getkey(),
    結果顯示error: no input,請問我的問題出錯在那,謝謝

    回覆刪除
    回覆
    1. 可能出在行數的對齊,程式內有一個While迴圈,出現的錯誤好像是getkey()執行一次就結束了,您可以將程式對齊縮排,再看看執行是否有問題。

      刪除
    2. 謝謝問題我解決了,,謝謝

      刪除
    3. 請問一下後來怎麼解決的,調了好久還是顯示no input

      刪除
  3. Ceiling老師您好
    我想請教一些問題
    L298N電機馬達驅動模組
    三個接腳(+12V GND +5V)
    +12V是供應給兩個直流馬達的嗎??
    而+5V是驅動模組上的晶片嗎?

    另外是馬達速度的問題
    請問是不是電壓越大馬達轉速越快呢??
    我是使用一顆9V的電池供應給L298N電機馬達驅動模組
    但是運轉時轉的非常緩慢..

    不好意思問題有點多,很想要了解這些問題
    麻煩老師能撥控回答一下
    感恩!




    回覆刪除
  4. 作者已經移除這則留言。

    回覆刪除
  5. 您好 我想請問一下Enable A 上 兩個腳位 是做甚麼用的 該怎麼連接 raspberry?

    回覆刪除
  6. 請問一下,是打完這個程式就能用鍵盤操控了嗎?我的都沒反應 = =

    回覆刪除
  7. 老師:
    您好!冒昧請教如何在樹莓派3中安裝curses?

    回覆刪除
    回覆
    1. raspbian內的python已經有curses模組在內,印象中我沒有特別安裝。如果要安裝,可以執行以下指令:
      sudo apt-get install libncurses5-dev libncursesw5-dev

      刪除

張貼留言

較新的 較舊