整合性的範例就來一台機器手臂遙控機器人吧,把機器手臂裝在雙馬達車體上就完工了,一樣可以透過 App Inventor 來編寫。使用多個按鈕來控制機器人的各個動作。
雙A計畫文章總覽:

台南 Maker Faire 現場展示很受歡迎喔!!
本範例使用 86duino Educake來製作電路,您可使用各種相容 Arduino 板子。以下是主程式流程,還需要匯入其他函式庫,在此就不列出囉,請直接下載檔案即可。

共有四個 ino 檔:
- Car_Motion.ino 控制車身動作,接腳與 L293D 馬達控制晶片接腳位有關
- Educake_RobotArmCar2.ino 程式主流程,負責接受外部的藍牙訊號來執行對應動作
- initial.ino 初始化
- Servoe_Motion.ino 控制伺服馬達,請注意轉動角度每台機器人可能略有差異,角度不要用到底以免機構干涉
[pastacode lang=”c” message=”Educake_RobotArmCar2.ino” highlight=”” provider=”manual” manual=”%23include%20%3CServo.h%3E%0A%0AServo%20BottomServo%3B%20%2F%2F%20%E5%BA%95%E7%9B%A4%E6%97%8B%E8%BD%89%E9%A6%AC%E9%81%94%0AServo%20ArmAServo%3B%20%2F%2F%20%E5%BE%8C%E8%87%82%E5%8D%87%E9%99%8D%E9%A6%AC%E9%81%94%0AServo%20ArmBServo%3B%20%2F%2F%20%E5%89%8D%E8%87%82%E9%A6%AC%E9%81%94%0AServo%20ClampServo%3B%20%2F%2F%20%E5%A4%BE%E7%88%AA%E9%A6%AC%E9%81%94%0A%0A%0Achar%20command%3B%20%20%20%20%2F%2Fread%20the%20char%0A%23define%20ServoDelayTime%2050%0A%0Avoid%20setup()%20%7B%0A%20%20%2F%2F%20put%20your%20setup%20code%20here%2C%20to%20run%20once%3A%0A%20%20Serial.begin(9600)%3B%20%20%20%20%20%20%20%20%20%2F%2FThe%20monitor%20UART%0A%20%20Serial1.begin(9600)%3B%20%20%20%20%20%20%20%2F%2FThe%20Bluetooth%20UART%0A%0A%20%20SetUp_Pin()%3B%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2FSet%20the%20Servo%20and%20Motor%20Pin%0A%20%20Servo_stop()%3B%0A%7D%0A%0Avoid%20loop()%20%7B%0A%20%20%2F%2F%20put%20your%20main%20code%20here%2C%20to%20run%20repeatedly%3A%0A%20%20if%20(Serial1.available()%20%3E%200)%0A%20%20%7B%0A%20%20%20%20command%20%3D%20Serial1.read()%3B%0A%20%20%20%20Serial1.println(command)%3B%0A%20%20%20%20Serial.println(command)%3B%0A%20%20%7D%0A%20%20switch%20(command)%0A%20%20%7B%0A%20%20%20%20case%20’F’%3A%0A%20%20%20%20%20%20CarForward()%3B%0A%20%20%20%20%20%20break%3B%0A%20%20%20%20case%20’B’%3A%0A%20%20%20%20%20%20CarBack()%3B%0A%20%20%20%20%20%20break%3B%0A%20%20%20%20case%20’R’%3A%0A%20%20%20%20%20%20CarRight()%3B%0A%20%20%20%20%20%20break%3B%0A%20%20%20%20case%20’L’%3A%0A%20%20%20%20%20%20CarLeft()%3B%0A%20%20%20%20%20%20break%3B%0A%20%20%20%20case%20’S’%3A%0A%20%20%20%20%20%20CarStop()%3B%0A%20%20%20%20%20%20break%3B%0A%20%20%20%20case%20’0’%3A%0A%20%20%20%20%20%20Serial.println(%22Servo%20all%20stop%22)%3B%0A%20%20%20%20%20%20%2F%2FServo_stop()%3B%0A%20%20%20%20%20%20delay(ServoDelayTime)%3B%0A%20%20%20%20%20%20break%3B%0A%20%20%20%20case%20’1’%3A%0A%20%20%20%20%20%20Serial.println(%22MeArm%20turn%20Left%22)%3B%0A%20%20%20%20%20%20%2F%2FServo_stop()%3B%0A%20%20%20%20%20%20BottomLeft()%3B%0A%20%20%20%20%20%20delay(ServoDelayTime)%3B%0A%20%20%20%20%20%20break%3B%0A%20%20%20%20case%20’2’%3A%0A%20%20%20%20%20%20Serial.println(%22MeArm%20turn%20Right%22)%3B%0A%20%20%20%20%20%20%2F%2FServo_stop()%3B%0A%20%20%20%20%20%20BottomRight()%3B%0A%20%20%20%20%20%20delay(ServoDelayTime)%3B%0A%20%20%20%20%20%20break%3B%0A%20%20%20%20case%20’3’%3A%0A%20%20%20%20%20%20Serial.println(%22Arm%20A%20Up%22)%3B%0A%20%20%20%20%20%20%2F%2FServo_stop()%3B%0A%20%20%20%20%20%20Arm_A_Up()%3B%0A%20%20%20%20%20%20delay(ServoDelayTime)%3B%0A%20%20%20%20%20%20break%3B%0A%20%20%20%20case%20’4’%3A%0A%20%20%20%20%20%20Serial.println(%22Arm%20A%20Down%22)%3B%0A%20%20%20%20%20%20%2F%2FServo_stop()%3B%0A%20%20%20%20%20%20Arm_A_Down()%3B%0A%20%20%20%20%20%20delay(ServoDelayTime)%3B%0A%20%20%20%20%20%20break%3B%0A%20%20%20%20case%20’5’%3A%0A%20%20%20%20%20%20Serial.println(%22Arm%20B%20Up%22)%3B%0A%20%20%20%20%20%20%2F%2FServo_stop()%3B%0A%20%20%20%20%20%20Arm_B_Up()%3B%0A%20%20%20%20%20%20delay(ServoDelayTime)%3B%0A%20%20%20%20%20%20break%3B%0A%20%20%20%20case%20’6’%3A%0A%20%20%20%20%20%20Serial.println(%22Arm%20B%20Down%22)%3B%0A%20%20%20%20%20%20%2F%2FServo_stop()%3B%0A%20%20%20%20%20%20Arm_B_Down()%3B%0A%20%20%20%20%20%20delay(ServoDelayTime)%3B%0A%20%20%20%20%20%20break%3B%0A%20%20%20%20case%20’7’%3A%0A%20%20%20%20%20%20Serial.println(%22Clamp%20Open%22)%3B%0A%20%20%20%20%20%20%2F%2FServo_stop()%3B%0A%20%20%20%20%20%20ClampOpen()%3B%0A%20%20%20%20%20%20delay(ServoDelayTime)%3B%0A%20%20%20%20%20%20break%3B%0A%20%20%20%20case%20’8’%3A%0A%20%20%20%20%20%20Serial.println(%22Clamp%20Close%22)%3B%0A%20%20%20%20%20%20%2F%2FServo_stop()%3B%0A%20%20%20%20%20%20ClampClose()%3B%0A%20%20%20%20%20%20delay(ServoDelayTime)%3B%0A%20%20%20%20%20%20break%3B%0A%20%20%7D%0A%0A%20%20if%20(Serial.available()%20%3E%200)%0A%20%20%7B%0A%20%20%20%20command%20%3D%20Serial.read()%3B%0A%20%20%20%20Serial.println(command)%3B%0A%20%20%7D%0A%7D”/]
[pastacode lang=”c” message=”Car_Motion.ino” highlight=”” provider=”manual” manual=”%0Avoid%20CarStop()%0A%7B%0A%20%20Serial.println(%22Car%20Stop%22)%3B%0A%0A%20%20%2F%2FRight%20Motor%0A%20%20digitalWrite(4%2C%20LOW)%3B%0A%20%20digitalWrite(5%2C%20LOW)%3B%0A%20%20%2F%2FLeft%20Motor%0A%20%20digitalWrite(7%2C%20LOW)%3B%0A%20%20digitalWrite(8%2C%20LOW)%3B%0A%7D%0Avoid%20CarForward()%0A%7B%0A%20%20Serial.println(%22Car%20Forward%22)%3B%0A%0A%20%20%2F%2FRight%20Motor%0A%20%20digitalWrite(4%2C%20HIGH)%3B%0A%20%20digitalWrite(5%2C%20LOW)%3B%0A%20%20%2F%2FLeft%20Motor%0A%20%20digitalWrite(7%2C%20HIGH)%3B%0A%20%20digitalWrite(8%2C%20LOW)%3B%0A%7D%0A%0Avoid%20CarBack()%0A%7B%0A%20%20Serial.println(%22Car%20Back%22)%3B%0A%0A%20%20%2F%2FRight%20Motor%0A%20%20digitalWrite(4%2C%20LOW)%3B%0A%20%20digitalWrite(5%2C%20HIGH)%3B%0A%20%20%2F%2FLeft%20Motor%0A%20%20digitalWrite(7%2C%20LOW)%3B%0A%20%20digitalWrite(8%2C%20HIGH)%3B%0A%7D%0A%0Avoid%20CarLeft()%0A%7B%0A%20%20Serial.println(%22Car%20Left%22)%3B%0A%0A%20%20%2F%2FRight%20Motor%0A%20%20digitalWrite(4%2C%20LOW)%3B%0A%20%20digitalWrite(5%2C%20LOW)%3B%0A%20%20%2F%2FLeft%20Motor%0A%20%20digitalWrite(7%2C%20HIGH)%3B%0A%20%20digitalWrite(8%2C%20LOW)%3B%0A%7D%0A%0Avoid%20CarRight()%0A%7B%0A%20%20Serial.println(%22Car%20Right%22)%3B%0A%0A%20%20%2F%2FRight%20Motor%0A%20%20digitalWrite(4%2C%20HIGH)%3B%0A%20%20digitalWrite(5%2C%20LOW)%3B%0A%20%20%2F%2FLeft%20Motor%0A%20%20digitalWrite(7%2C%20LOW)%3B%0A%20%20digitalWrite(8%2C%20LOW)%3B%0A%7D%0A”/]
[pastacode lang=”c” message=”initial.ino” highlight=”” provider=”manual” manual=”%23define%20Bottom_pin%20%203%20%20%20%20%20%20%2F%2F%20%E5%BA%95%E7%9B%A4%E6%97%8B%E8%BD%89%E9%A6%AC%E9%81%94%0A%23define%20ArmA_pin%20%206%20%20%20%20%20%20%20%20%2F%2F%20%E5%BE%8C%E8%87%82%E5%8D%87%E9%99%8D%E9%A6%AC%E9%81%94%0A%23define%20ArmB_pin%20%209%20%20%20%20%20%20%20%20%2F%2F%20%E5%89%8D%E8%87%82%E9%A6%AC%E9%81%94%0A%23define%20Clamp_pin%20%2010%20%20%20%20%20%20%2F%2F%20%E5%A4%BE%E7%88%AA%E9%A6%AC%E9%81%94%0A%0A%23define%20RightMotor1%204%0A%23define%20RightMotor2%205%0A%23define%20LeftMotor1%207%0A%23define%20LeftMotor2%208%0A%0Avoid%20SetUp_Pin()%0A%7B%0A%20%20BottomServo.attach(Bottom_pin)%3B%0A%20%20ArmAServo.attach(ArmA_pin)%3B%0A%20%20ArmBServo.attach(ArmB_pin)%3B%0A%20%20ClampServo.attach(Clamp_pin)%3B%0A%0A%20%20%2F%2F%E5%85%8B%E5%AE%9A%E9%A6%AC%E9%81%94%E6%AD%A3%E5%8F%8D%E8%BD%89%E8%85%B3%E4%BD%8D%0A%20%20pinMode(RightMotor1%2C%20OUTPUT)%3B%0A%20%20pinMode(RightMotor2%2C%20OUTPUT)%3B%0A%20%20pinMode(LeftMotor1%2C%20OUTPUT)%3B%0A%20%20pinMode(LeftMotor2%2C%20OUTPUT)%3B%0A%0A%20%20digitalWrite(RightMotor1%2C%20LOW)%3B%0A%20%20digitalWrite(RightMotor2%2C%20LOW)%3B%0A%20%20digitalWrite(LeftMotor1%2C%20LOW)%3B%0A%20%20digitalWrite(LeftMotor2%2C%20LOW)%3B%0A%7D”/]
[pastacode lang=”c” message=”Servoe_Motion.ino” highlight=”” provider=”manual” manual=”%2F%2FSG90%3A%20500~2500us%0A%2F%2FSG90%20degree%20duration%3A11.1%0A%2F%2FSG90%200%20degree%20%3D500%0A%2F%2FSG90%20180%20degree%20%3D2500%0A%0A%2F%2FMG90%3A%20400~2400%0A%2F%2FMG90%20degree%20duration%3A11.1%0A%2F%2FMG90%200%20degree%20%3D400%0A%2F%2FMG90%20180%20degree%20%3D2400%0A%0A%2F%2Fdefine%20Servo%20name%0A%2F%2FServo%20BottomServo%3B%20%2F%2F%20%E5%BA%95%E7%9B%A4%E6%97%8B%E8%BD%89%E9%A6%AC%E9%81%94%0A%2F%2FServo%20ArmAServo%3B%20%2F%2F%20%E5%BE%8C%E8%87%82%E5%8D%87%E9%99%8D%E9%A6%AC%E9%81%94%0A%2F%2FServo%20ArmBServo%3B%20%2F%2F%20%E5%89%8D%E8%87%82%E9%A6%AC%E9%81%94%0A%2F%2FServo%20ClampServo%3B%20%2F%2F%20%E5%A4%BE%E7%88%AA%E9%A6%AC%E9%81%94%0A%0A%2F%2FServo%20Range%0A%23define%20Bottom_max%20%20180%20%20%20%20%20%20%2F%2FTurn%20Left%0A%23define%20Bottom_min%20%2050%20%20%20%20%20%20%20%2F%2FTurn%20Right%0A%23define%20Clamp_max%20%20115%20%20%20%20%20%20%20%20%2F%2Fclose%0A%23define%20Clamp_min%20%2060%20%20%20%20%20%20%20%20%2F%2Fopen%0A%23define%20ArmA_max%20%20150%0A%23define%20ArmA_min%20%2050%0A%23define%20ArmB_max%20%20180%0A%23define%20ArmB_min%20%2070%0A%0A%2F%2FServo%20Initial%20Degree%0Aint%20Clamp_pos%20%3D%20Clamp_max%3B%0Aint%20Bottom_pos%20%3D%20(Bottom_max%20%2B%20Bottom_min)%20%2F%202%3B%0Aint%20ArmA_pos%20%3D%20ArmA_min%3B%0Aint%20ArmB_pos%20%3D%20ArmB_max%3B%0A%0A%2F%2Fservo%20degree%20duration%0Aint%20delta%20%3D%205%3B%0Aint%20delta_bottom%20%3D%202%3B%0A%0A%0Avoid%20Servo_stop()%0A%7B%0A%20%20BottomServo.write(Bottom_pos)%3B%0A%20%20ClampServo.write(Clamp_pos)%3B%0A%20%20ArmAServo.write(ArmA_pos)%3B%0A%20%20ArmBServo.write(ArmB_pos)%3B%0A%7D%0A%0Avoid%20BottomLeft()%0A%7B%0A%20%20if%20(Bottom_pos%20%2B%20delta_bottom%20%3C%20Bottom_max)%20%7B%20Bottom_pos%20%2B%3D%20delta_bottom%3B%20%7D%20MG90(1%2C%20Bottom_pos)%3B%20%7D%20void%20BottomRight()%20%7B%20if%20(Bottom_pos%20-%20delta_bottom%20%3E%20Bottom_min)%0A%20%20%20%20Bottom_pos%20-%3D%20delta_bottom%3B%0A%20%20MG90(1%2C%20Bottom_pos)%3B%0A%7D%0A%0Avoid%20Arm_A_Up()%0A%7B%0A%20%20if%20(ArmA_pos%20%2B%20delta%20%3C%20ArmA_max)%20ArmA_pos%20%2B%3D%20delta%3B%20SG90(2%2C%20ArmA_pos)%3B%20%7D%20void%20Arm_A_Down()%20%7B%20if%20(ArmA_pos%20-%20delta%20%3E%20ArmA_min)%0A%20%20%20%20ArmA_pos%20-%3D%20delta%3B%0A%20%20SG90(2%2C%20ArmA_pos)%3B%0A%7D%0A%0Avoid%20Arm_B_Up()%0A%7B%0A%20%20if%20(ArmB_pos%20-%20delta%20%3E%20ArmB_min)%0A%20%20%20%20ArmB_pos%20-%3D%20delta%3B%0A%20%20SG90(3%2C%20ArmB_pos)%3B%0A%7D%0A%0Avoid%20Arm_B_Down()%0A%7B%0A%20%20if%20(ArmB_pos%20%2B%20delta%20%3C%20ArmB_max)%0A%20%20%20%20ArmB_pos%20%2B%3D%20delta%3B%0A%20%20SG90(3%2C%20ArmB_pos)%3B%0A%7D%0A%0Avoid%20ClampOpen()%0A%7B%0A%20%20Clamp_pos%20%3D%20Clamp_min%3B%0A%20%20SG90(4%2C%20Clamp_pos)%3B%0A%7D%0A%0Avoid%20ClampClose()%0A%7B%0A%20%20Clamp_pos%20%3D%20Clamp_max%3B%0A%20%20SG90(4%2C%20Clamp_pos)%3B%0A%7D%0A%0A%0Aint%20SG90(int%20myServo%2C%20int%20angle)%0A%7B%0A%20%20angle%20%3D%20500%20%2B%20(angle%20*%2011.1)%3B%0A%0A%20%20if%20(myServo%20%3D%3D%202)%0A%20%20%7B%0A%20%20%20%20ArmAServo.writeMicroseconds(angle)%3B%0A%20%20%7D%0A%20%20if%20(myServo%20%3D%3D%203)%0A%20%20%7B%0A%20%20%20%20ArmBServo.writeMicroseconds(angle)%3B%0A%20%20%7D%0A%20%20if%20(myServo%20%3D%3D%204)%0A%20%20%7B%0A%20%20%20%20ClampServo.writeMicroseconds(angle)%3B%0A%20%20%7D%0A%20%20return%20(angle)%3B%0A%7D%0A%0A%0A%0Aint%20MG90(int%20myServo%2C%20int%20angle)%0A%7B%0A%20%20angle%20%3D%20400%20%2B%20(angle%20*%2011.1)%3B%0A%20%20if%20(myServo%20%3D%3D%201)%0A%20%20%7B%0A%20%20%20%20BottomServo.writeMicroseconds(angle)%3B%0A%20%20%7D%0A%20%20return%20(angle)%3B%0A%7D”/]
Post Views: 532