色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

手把手教你如何自制輪式機器人

GReq_mcu168 ? 來源:博客 ? 作者:繆宇飏,myyerrol ? 2021-06-07 15:36 ? 次閱讀

擊上方“果果小師弟”,選擇“置頂/星標公眾號”

摘要:制作這個項目的起因是大一下學期那會兒我通過學校圖書館里的《無線電》雜志開始接觸Raspberry Pi卡片式計算機和Arduino微控制器,其中Raspberry Pi給當初什么都不懂的我留下了非常深刻的印象:一個信用卡大小的板子竟然可以跑帶有圖形界面的GNU/Linux操作系統

在強烈探索欲的驅使下,我從網上購買了兩塊Element14的Raspberry Pi一代Model B(現在早已經絕版了)板子以及其他相關配件,開始在Raspbian系統上自學Python和各種傳感器的使用方法,后來為了檢驗一下自己的學習成果,于是我便花費幾周的時間做了這個簡單的輪式機器人。雖然它涉及的原理并不復雜,但是對于那會兒剛開始接觸嵌入式的我來說,能成功搭建一個完整的機器人系統還是挺有挑戰性的。

概述簡單輪式機器人其實是一個比較傳統的入門級智能小車,它擁有藍牙遠程遙控、超聲波避障、紅外邊緣檢測和紅外巡線(未完成)等功能,可以完成一些有趣的小實驗。此外,簡單輪式機器人的軟件是開源的,具體代碼可以從我的GitHub倉庫上獲得。

原理硬件以下是該簡單輪式機器人的硬件系統連接圖:

085fd136-c655-11eb-9e57-12bb97331649.png

核心主控

系統的硬件核心主控分別為Arduino和Raspberry Pi。其中Arduino主要負責接收紅外光電測距模塊的數據,并控制裝有超聲波模塊的單軸舵機云臺的旋轉;而Raspberry Pi則可通過電機驅動模塊來完成對四個直流減速電機轉向和轉速的控制,此外它還能接收超聲波模塊和從Arduino串口發送上來的紅外光電測距模塊的數據來判斷當前機器人的前方和兩側是否遇到障礙物,若機器人與障礙物之間的距離小于一個特定的閾值,則Arduino和Raspberry Pi會分別改變LED的顏色并啟動蜂鳴器來發出警報。

當然,肯定會有人問:為什么我不能僅用Raspberry Pi來作為機器人的核心主控,非要再用一個Arduino呢?其實根據本項目的實際需求,確實只用一個Raspberry Pi就夠了,不過對于我來說使用Arduino主要出于以下三個原因的考慮:

Raspberry Pi一代Model B板子的GPIO引腳數量只有26個,就算復用一些帶有特殊功能的引腳,引腳資源依舊比較緊張。

Raspberry Pi官方提供的GPIO庫雖然含有PWM函數,但是實際在控制舵機的時候可能是由于軟件模擬的PWM方波還不夠穩定,導致舵機抖動得比較厲害。

可以學習Python的串口編程

因此,綜合以上三個方面我選擇了Arduino和Raspberry Pi雙核心主控的系統架構。

外部電源

因為時間比較緊張,所以我沒有在電源管理上花費太多的功夫。對于Arduino,我使用的是能裝下6個1.5V干電池的的電池盒給其供電,而對于Raspberry Pi耗電量較大的需求,我是從大學舍友那借了一個充電寶來解決問題的,不過雖然供電可以了,但是由于充電寶的重量比較大,導致四個輪子受壓偏大,使得遙控的精準度受到了一定的影響。

電機驅動

機器人的電機驅動部分采用傳統的L293D芯片,它是一款單片集成的高電壓、高電流、四通道電機驅動芯片,其內部包含有兩個雙極型H橋電路,可通過設置IN1和IN2輸入引腳的邏輯電平來控制電機的旋轉方向,而EN使能引腳可連接到一路PWM上,通過調整PWM方波的占空比便可調整電機的轉速。

數據感知

為了能實現最基本的避障功能,我們需要為機器人配備有一些傳感器。這里我使用的傳感器為HC-SR04超聲波測距模塊和紅外光電避障模塊,其中紅外光電避障模塊具有一對紅外線發射與接收管,運行時發射管會發射出一定頻率的紅外線,當檢測方向遇到障礙物后,紅外線會反射回來被接收管接收,經過比較電路處理之后,信號輸出接口會輸出一個低電平信號,這樣只要在程序中對該接口的電平進行判斷便能得知機器人是否距離障礙物比較近。

與紅外光電避障模塊的工作原理類似,超聲波模塊能夠向空中發射超聲波信號,當其檢測到反射回來的信號后,只需將超聲波從發射到接收所用的時間乘上聲速再除以二便能得到機器人和障礙物之間的距離,從而為之后的機器人避障做好準備。

軟件Raspberry Pi庫代碼

simple_wheeled_robot_lib.py

該庫代碼實現了GPIO引腳初始化函數、LED燈設置函數、蜂鳴器設置函數、電機控制函數、超聲波測距函數和LCD1602顯示函數,其中LCD1602顯示函數調用了Python的SMBUS庫來完成IIC數據通信,從而能將字符串顯示在屏幕上(注意:SMBUS和IIC協議之間是存在區別的,但在Raspberry Pi上兩者概念基本等同)。

import time

import smbus

import RPi.GPIO as gpio

motor_run_left = 17

motor_run_right = 10

motor_direction_left = 4

motor_direction_right = 25

led_left = 7

led_right = 8

ultrasonic_trig = 23

ultrasonic_echo = 24

servo = 11

buzzer = 18

lcd_address = 0x27

data_bus = smbus.SMBus(1)

class SimpleWheeledRobot:

def __init__(self):

gpio.setmode(gpio.BCM)

gpio.setup(motor_run_left, gpio.OUT)

gpio.setup(motor_run_right, gpio.OUT)

gpio.setup(motor_direction_left, gpio.OUT)

gpio.setup(motor_direction_right, gpio.OUT)

gpio.setup(led_left, gpio.OUT)

gpio.setup(led_right, gpio.OUT)

def set_motors(self, run_left, direction_left, run_right, direction_right):

gpio.output(motor_run_left, run_left)

gpio.output(motor_run_right, run_right)

gpio.output(motor_direction_left, direction_left)

gpio.output(motor_direction_right, direction_right)

def set_led_left(self, state):

gpio.output(led_left, state)

def set_led_right(self, state):

gpio.output(led_right, state)

def go_forward(self, seconds):

if seconds == 0:

self.set_motors(1, 1, 1, 1)

self.set_led_left(1)

self.set_led_right(1)

else:

self.set_motors(1, 1, 1, 1)

time.sleep(seconds)

gpio.cleanup()

def go_reverse(self, seconds):

if seconds == 0:

self.set_motors(1, 0, 1, 0)

self.set_led_left(0)

self.set_led_right(0)

else:

self.set_motors(1, 0, 1, 0)

time.sleep(seconds)

gpio.cleanup()

def go_left(self, seconds):

if seconds == 0:

self.set_motors(0, 0, 1, 1)

self.set_led_left(1)

self.set_led_right(0)

else:

self.set_motors(0, 0, 1, 1)

time.sleep(seconds)

gpio.cleanup()

def go_right(self, seconds):

if seconds == 0:

self.set_motors(1, 1, 0, 0)

self.set_led_left(0)

self.set_led_right(1)

else:

self.set_motors(1, 1, 0, 0)

time.sleep(seconds)

gpio.cleanup()

def go_pivot_left(self, seconds):

if seconds == 0:

self.set_motors(1, 0, 1, 1)

self.set_led_left(1)

self.set_led_right(0)

else:

self.set_motors(1, 0, 1, 1)

time.sleep(seconds)

gpio.cleanup()

def go_pivot_right(self, seconds):

if seconds == 0:

self.set_motors(1, 1, 1, 0)

self.set_led_left(0)

self.set_led_right(1)

else:

self.set_motors(1, 1, 1, 0)

time.sleep(seconds)

gpio.cleanup()

def stop(self):

self.set_motors(0, 0, 0, 0)

self.set_led_left(0)

self.set_led_right(0)

def buzzing(self):

gpio.setup(buzzer, gpio.OUT)

gpio.output(buzzer, True)

for x in range(5):

gpio.output(buzzer, False)

time.sleep(0.1)

gpio.output(buzzer, True)

time.sleep(0.1)

def get_distance(self):

gpio.setmode(gpio.BCM)

gpio.setup(ultrasonic_trig, gpio.OUT)

gpio.setup(ultrasonic_echo, gpio.IN)

gpio.output(ultrasonic_trig, False)

while gpio.input(ultrasonic_echo) == 0:

start_time = time.time()

while gpio.input(ultrasonic_echo) == 1:

stop_time = time.time()

duration = stop_time - start_time

distance = (duration * 34300) / 2

gpio.cleanup()

return distance

def send_command(self, command):

buf = command & 0xF0

buf |= 0x04

data_bus.write_byte(lcd_address, buf)

time.sleep(0.002)

buf &= 0xFB

data_bus.write_byte(lcd_address, buf)

buf = (command & 0x0F) 《《 4

buf |= 0x04

data_bus.write_byte(lcd_address, buf)

time.sleep(0.002)

buf &= 0xFB

data_bus.write_byte(lcd_address, buf)

def send_data(self, data):

buf = data & 0xF0

buf |= 0x05

data_bus.write_byte(lcd_address, buf)

time.sleep(0.002)

buf &= 0xFB

data_bus.write_byte(lcd_address, buf)

buf = (data & 0x0F) 《《 4

buf |= 0x05

data_bus.write_byte(lcd_address, buf)

time.sleep(0.002)

buf &= 0xFB

data_bus.write_byte(lcd_address, buf)

def initialize_lcd(self):

try:

self.send_command(0x33)

time.sleep(0.005)

self.send_command(0x32)

time.sleep(0.005)

self.send_command(0x28)

time.sleep(0.005)

self.send_command(0x0C)

time.sleep(0.005)

self.send_command(0x01)

except:

return False

else:

return True

def clear_lcd(self):

self.send_command(0x01)

def print_lcd(self, x, y, lcd_string):

if x 《 0:

x = 0

if x 》 15:

x = 15

if y 《 0:

y = 0

if y 》 1:

y = 1

address = 0x80 + 0x40 * y + x

self.send_command(address)

for lcd_char in lcd_string:

self.send_data(ord(lcd_char))

def move_servo_left(self):

servo_range = 13

gpio.setmode(gpio.BCM)

gpio.setup(servo, gpio.OUT)

pwm = gpio.PWM(servo, 100)

pwm.start(0)

while servo_range 《= 23:

pwm.ChangeDutyCycle(servo_range)

servo_range += 1

time.sleep(0.5)

pwm.stop()

def move_servo_right(self):

servo_range = 13

gpio.setmode(gpio.BCM)

gpio.setup(servo, gpio.OUT)

pwm = gpio.PWM(servo, 100)

pwm.start(0)

while servo_range 》= 0:

pwm.ChangeDutyCycle(servo_range)

servo_range -= 1

time.sleep(0.5)

pwm.stop()

Raspberry Pi測試代碼1

simple_wheeled_robot_run_1.py

該代碼調用了上面自己編寫的機器人代碼庫,主要實現了超聲波距離檢測函數和鍵盤遙控函數,其中鍵盤遙控函數里面又根據所按按鍵的不同調用并組合上面代碼庫中的不同函數來完成某些特定的功能(比如機器人遇到障礙物后首先會發出警報,然后再進行相應的規避運動等)。

import time

import serial

import random

import Tkinter as tk

import RPi.gpio as gpio

from simple_wheeled_robot_lib import SimpleWheeledRobot

simple_wheeled_robot = SimpleWheeledRobot()

simple_wheeled_robot.initialize_lcd()

port = “/dev/ttyUSB0”

serial_to_arduino = serial.Serial(port, 9600)

serial_from_arduino = serial.Serial(port, 9600)

serial_from_arduino.flushInput()

serial_to_arduino.write(‘n’)

def detecte_distance():

distance = simple_wheeled_robot.get_distance()

if distance 》= 20:

# Light up the green led.

serial_to_arduino.write(‘g’)

elif distance 》= 10:

# Light up the yellow led.

serial_to_arduino.write(‘y’)

elif distance 《 10:

# Light up the red led.

serial_to_arduino.write(‘r’)

simple_wheeled_robot.buzzing()

simple_wheeled_robot.__init__()

simple_wheeled_robot.go_reverse(2)

simple_wheeled_robot.__init__()

simple_wheeled_robot.go_pivot_right(2)

# Check the distance between wall and car‘s both sides.

serial_to_arduino.write(’k‘)

data_from_arduino = serial_from_arduino.readline()

data_from_arduino_int = int(data_from_arduino)

# Car is too close to the left wall.

if data_from_arduino_int == 01:

simple_wheeled_robot.buzzing()

simple_wheeled_robot.__init__()

simple_wheeled_robot.go_right(2)

# Car is too close to the right wall.

elif data_from_arduino_int == 10:

simple_wheeled_robot.buzzing()

simple_wheeled_robot.__init__()

simple_wheeled_robot.go_left(2)

def input_key(event):

simple_wheeled_robot.__init__()

print ’Key‘, event.char

key_press = event.char

seconds = 0.05

if key_press.lower() == ’w‘:

simple_wheeled_robot.go_forward(seconds)

elif key_press.lower() == ’s‘:

simple_wheeled_robot.go_reverse(seconds)

elif key_press.lower() == ’a‘:

simple_wheeled_robot.go_left(seconds)

elif key_press.lower() == ’d‘:

simple_wheeled_robot.go_right(seconds)

elif key_press.lower() == ’q‘:

simple_wheeled_robot.go_pivot_left(seconds)

elif key_press.lower() == ’e‘:

simple_wheeled_robot.go_pivot_right(seconds)

elif key_press.lower() == ’o‘:

gpio.cleanup()

# Move the servo in forward directory.

serial_to_arduino.write(’o‘)

time.sleep(0.05)

elif key_press.lower() == ’h‘:

gpio.cleanup()

# Light up the logo.

serial_to_arduino.write(’h‘)

elif key_press.lower() == ’j‘:

gpio.cleanup()

# Turn off the logo.

serial_to_arduino.write(’j‘)

elif key_press.lower() == ’p‘:

gpio.cleanup()

# Move the servo in reverse directory.

serial_to_arduino.write(’p‘)

time.sleep(0.05)

elif key_press.lower() == ’i‘:

gpio.cleanup()

serial_to_arduino.write(’m‘)

# Enter the random run mode.

serial_to_arduino.write(’i‘)

for z in range(20):

x = random.randrange(0, 5)

if x == 0:

for y in range(30):

detecte_distance()

simple_wheeled_robot.__init__()

simple_wheeled_robot.go_forward(0.05)

elif x == 1:

for y in range(30):

detecte_distance()

simple_wheeled_robot.__init__()

simple_wheeled_robot.go_left(0.05)

elif x == 2:

for y in range(30):

detecte_distance()

simple_wheeled_robot.__init__()

simple_wheeled_robot.go_right(0.05)

elif x == 3:

for y in range(30):

detecte_distance()

simple_wheeled_robot.__init__()

simple_wheeled_robot.go_pivot_left(0.05)

elif x == 4:

for y in range(30):

detecte_distance()

simple_wheeled_robot.__init__()

simple_wheeled_robot.go_pivot_right(0.05)

data_from_arduino = serial_from_arduino.readline()

data_from_arduino_int = int(data_from_arduino)

if data_from_arduino_int == 1111:

simple_wheeled_robot.__init__()

simple_wheeled_robot.go_forward(0.05)

if data_from_arduino_int == 1111:

simple_wheeled_robot.__init__()

simple_wheeled_robot.stop()

elif data_from_arduino_int == 0000:

simple_wheeled_robot.__init__()

simple_wheeled_robot.go_forward(0.05)

elif data_from_arduino_int == 0100:

simple_wheeled_robot.__init__()

simple_wheeled_robot.go_left(0.05)

elif data_from_arduino_int == 1000 or

data_from_arduino_int == 1100:

simple_wheeled_robot.__init__()

simple_wheeled_robot.go_left(0.08)

elif data_from_arduino_int == 0010:

simple_wheeled_robot.__init__()

simple_wheeled_robot.go_right(0.05)

elif data_from_arduino_int == 0001 or

data_from_arduino_int == 0011:

simple_wheeled_robot.__init__()

simple_wheeled_robot.go_right(0.08)

serial_to_arduino.write(’l‘)

elif key_press.lower() == ’u‘:

gpio.cleanup()

simple_wheeled_robot.print_lcd(1, 0, ’UltrasonicWare‘)

simple_wheeled_robot.print_lcd(1, 1, ’Distance:%.lf CM‘ %

simple_wheeled_robot.get_distance())

else:

pass

distance = simple_wheeled_robot.get_distance()

if distance 》= 20:

serial_to_arduino.write(’g‘)

elif distance 》= 10:

serial_to_arduino.write(’y‘)

elif distance 《 10:

serial_to_arduino.write(’r‘)

simple_wheeled_robot.buzzing()

simple_wheeled_robot.__init__()

simple_wheeled_robot.go_reverse(2)

serial_to_arduino.write(’k‘)

data_from_arduino = serial_from_arduino.readline()

data_from_arduino_int = int(data_from_arduino)

if data_from_arduino_int == 1:

simple_wheeled_robot.buzzing()

simple_wheeled_robot.__init__()

simple_wheeled_robot.go_right(2)

elif data_from_arduino_int == 10:

simple_wheeled_robot.buzzing()

simple_wheeled_robot.__init__()

simple_wheeled_robot.go_left(2)

try:

command = tk.Tk()

command.bind(’《KeyPress》‘, input_key)

command.mainloop()

except KeyboardInterrupt:

gpio.cleanup()

Raspberry Pi測試代碼2

simple_wheeled_robot_run_2.py

該代碼實現的功能比較簡單,僅測試了機器人的電機遙控和超聲波避障兩個功能。

import Tkinter as tk

import RPi.GPIO as gpio

from simple_wheeled_robot_lib import SimpleWheeledRobot

simple_wheeled_robot = SimpleWheeledRobot()

simple_wheeled_robot.initialize_lcd()

def input_key(event):

print ’Key‘, event.char

key_press = event.char

seconds = 0.05

if key_press.lower() == ’w‘:

simple_wheeled_robot.go_forward(seconds)

elif key_press.lower() == ’s‘:

simple_wheeled_robot.go_reverse(seconds)

elif key_press.lower() == ’a‘:

simple_wheeled_robot.go_left(seconds)

elif key_press.lower() == ’d‘:

simple_wheeled_robot.go_right(seconds)

elif key_press.lower() == ’q‘:

simple_wheeled_robot.go_pivot_left(seconds)

elif key_press.lower() == ’e‘:

simple_wheeled_robot.go_pivot_right(seconds)

elif key_press.lower() == ’o‘:

simple_wheeled_robot.move_servo_left()

elif key_press.lower() == ’p‘:

simple_wheeled_robot.move_servo_right()

else:

pass

distance = simple_wheeled_robot.get_distance()

simple_wheeled_robot.print_lcd(1, 0, ’UltrasonicWare‘)

simple_wheeled_robot.print_lcd(1, 1, ’Distance:%.lf CM‘ % distance)

print “Distance: %.1f CM” % distance

if distance 《 10:

simple_wheeled_robot.__init__()

simple_wheeled_robot.go_reverse(2)

try:

command = tk.Tk()

command.bind(’《KeyPress》‘, input_key)

command.mainloop()

except KeyboardInterrupt:

gpio.cleanup()

Raspberry Pi測試代碼3

simple_wheeled_robot_run_3.py

該代碼實現的功能與上面的測試代碼2類似,只不過圖形界面本代碼里使用的是Pygame而不是之前的Tkinter。

import sys

import pygame

from pygame.locals import *

import RPi.GPIO as gpio

from simple_wheeled_robot_lib import SimpleWheeledRobot

simple_wheeled_robot = SimpleWheeledRobot()

pygame.init()

screen = pygame.display.set_mode((800, 800))

font = pygame.font.SysFont(“arial”, 64)

pygame.display.set_caption(’SimpleWheeledRobot‘)

pygame.mouse.set_visible(0)

while True:

gpio.cleanup()

for event in pygame.event.get():

if event.type == QUIT:

sys.exit()

if event.type == KEYDOWN:

time = 0.03

if event.key == K_UP or event.key == ord(’w‘):

simple_wheeled_robot.go_forward(time)

elif event.key == K_DOWN or event.key == ord(’s‘):

simple_wheeled_robot.go_reverse(time)

elif event.key == K_LEFT or event.key == ord(’a‘):

simple_wheeled_robot.go_left(time)

elif event.key == K_RIGHT or event.key == ord(’d‘):

simple_wheeled_robot.go_right(time)

elif event.key == ord(’q‘):

simple_wheeled_robot.go_pivot_left(time)

elif event.key == ord(’e‘):

simple_wheeled_robot.go_pivot_right(time)

Arduino測試代碼

simple_wheeled_robot.ino

該代碼從邏輯上比較好理解,在setup()函數初始化引腳的模式和串口波特率后,主函數loop()會不斷地從串口中讀取字符數據,并根據字符的不同進行不同的處理工作。

int distance;

int distance_left;

int distance_right;

int motor_value;

int motor_value_a;

int motor_value_b;

int motor_value_c;

int motor_value_d;

int motor_a = 6;

int motor_b = 7;

int motor_c = 8;

int motor_d = 9;

int servo = 5;

int led = 2;

int led_red = 13;

int led_yellow = 12;

int led_green = 11;

int distance_sensor_left = 3;

int distance_sensor_right = 4;

char data;

uint16_t angle = 1500;

void setup()

{

// Set serial’s baud rate.

Serial.begin(9600);

pinMode(motor_a, INPUT);

pinMode(motor_b, INPUT);

pinMode(motor_c, INPUT);

pinMode(motor_d, INPUT);

pinMode(servo, OUTPUT);

pinMode(led , OUTPUT);

pinMode(led_red, OUTPUT);

pinMode(led_yellow, OUTPUT);

pinMode(led_green, OUTPUT);

pinMode(distance_sensor_left, INPUT);

pinMode(distance_sensor_right, INPUT);

pinMode(A0, OUTPUT);

pinMode(A1, OUTPUT);

pinMode(A2, OUTPUT);

pinMode(A3, OUTPUT);

pinMode(A4, OUTPUT);

pinMode(A5, OUTPUT);

}

void loop()

{

if (Serial.available()) {

switch(Serial.read()) {

// Light up the logo.

case ‘h’: {

digitalWrite(A0, HIGH);

digitalWrite(A1, HIGH);

digitalWrite(A2, HIGH);

digitalWrite(A3, HIGH);

digitalWrite(A4, HIGH);

digitalWrite(A5, HIGH);

break;

}

// Turn off the logo.

case ‘j’: {

digitalWrite(A0, LOW);

digitalWrite(A1, LOW);

digitalWrite(A2, LOW);

digitalWrite(A3, LOW);

digitalWrite(A4, LOW);

digitalWrite(A5, LOW);

break;

}

// Move the servo in forward directory.

case ‘o’ : {

angle += 50;

if (angle 》 2500) {

angle = 2500;

}

break;

}

// Move the servo in reverse directory.

case ‘p’ : {

angle -= 50;

if (angle 《 500) {

angle = 500;

}

break;

}

case ‘n’: {

digitalWrite(led, HIGH);

break;

}

case ‘m’: {

digitalWrite(led, LOW);

break;

}

case ‘g’: {

// When the distance between objects and car is far enough,

// light the green led.

digitalWrite(led_green, HIGH);

digitalWrite(led_yellow, LOW);

digitalWrite(led_red, LOW);

break;

}

case ‘y’: {

// When the distance between objects and car is near enough,

// light the yellow led.

digitalWrite(led_yellow, HIGH);

digitalWrite(led_green, LOW);

digitalWrite(led_red, LOW);

break;

}

case ‘r’: {

// When the distance between objects and car is very near,

// light the red led.

digitalWrite(led_red, HIGH);

digitalWrite(led_yellow, LOW);

digitalWrite(led_green, LOW);

break;

}

case ‘k’: {

// Return distance sensor‘s state between objects and car.

distance_left = digitalRead(distance_sensor_left);

distance_right = digitalRead(distance_sensor_right);

distance = distance_left * 10 + distance_right ;

Serial.println(distance, DEC);

break;

}

case ’i‘: {

while (1) {

// Return motor’s state to raspberry pi.

motor_value_a = digitalRead(motor_a);

motor_value_b = digitalRead(motor_b);

motor_value_c = digitalRead(motor_c);

motor_value_d = digitalRead(motor_d);

motor_value = motor_value_a * 1000 + motor_value_b * 100 +

motor_value_c * 10 + motor_value_d;

Serial.println(motor_value, DEC);

delay(1000);

data = Serial.read();

if (data == ‘l’) {

break;

}

}

}

default:

break;

}

}

// Delay enough time for servo to move position.

digitalWrite(servo, HIGH);

delayMicroseconds(angle);

digitalWrite(servo, LOW);

delay(15);

}

總結這個簡單輪式機器人是大一那會兒我對自己課外所學知識的一個應用。雖然現在回過頭再來看自己當初做的項目,感覺技術原理非常簡單,遠沒有我之后研究的ROS和MoveIt!那么復雜,但是通過整個制作過程,我學會了如何根據項目需求去網上購買相關的材料。

如何將主控等硬件設備安裝在機器人機械結構最合理的位置上,如何使用IDE編寫Arduino程序,如何在Raspberry Pi上使用Python語言來讀取硬件數據并控制硬件,如何實現簡單的串口通信等等。我一直認為興趣是最好的老師。

當你開始接觸一個全新的領域時,興趣可以成為你克服各種困難并鼓舞你前進的強大動力。當然,除了興趣,更重要的是親自動手實踐,書上的東西講得再好也是別人的,不是你的,就算重復造輪子也有著其無法替代的重要意義,因為并不是每個人都能造得出輪子,通過學習并實踐前人所學習過的知識,你會收獲別人不會有的寶貴經驗!

最后,個人認為智能小車對于廣大剛開始接觸機器人的初學者來說確實是一個非常好的練手項目,你可以根據自己的喜好和技術水平的高低來定制屬于你自己的智能小車,實現你想要的各種功能。總之,對于我來說。

通過本次項目我開始真正喜歡上了嵌入式開發并逐漸走上了專業化的道路,每個人都應該有自己的夢想,那這個簡單輪式機器人就是我夢想的起點,激勵著我不斷向前!當然,也希望大家能在制作機器人的道路上玩得開心并有所收獲!

文章作者:繆宇飏,myyerrol 轉載于:https://myyerrol.io/zh-cn/2018/05/15/diy_robots_1_simple_wheeled_robot/

編輯:jq

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • PWM
    PWM
    +關注

    關注

    114

    文章

    5196

    瀏覽量

    214495
  • 電機
    +關注

    關注

    142

    文章

    9070

    瀏覽量

    146070
  • 函數
    +關注

    關注

    3

    文章

    4344

    瀏覽量

    62857
  • 代碼
    +關注

    關注

    30

    文章

    4816

    瀏覽量

    68873
  • GPIO
    +關注

    關注

    16

    文章

    1216

    瀏覽量

    52266

原文標題:干貨|手把手教你自制輪式機器人

文章出處:【微信號:mcu168,微信公眾號:硬件攻城獅】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    手把手教你做星閃無人機》即將開播,鎖定15日晚七點!

    ”再次聯合推出《手把手教你做星閃無人機—KaihongOS星閃無人機開發實戰》系列課程,該課程與《手把手教你做PC—KaihongOS筆記本電腦開發實戰》同步并行,
    的頭像 發表于 01-13 19:42 ?79次閱讀
    《<b class='flag-5'>手把手</b><b class='flag-5'>教你</b>做星閃無人機》即將開播,鎖定15日晚七點!

    手把手教你做PC》課程即將啟動!深開鴻引領探索KaihongOS筆記本電腦開發實戰

    ”攜手“電子發燒友”聯合推出了《KaihongOS手把手系列直播課程》,該系列課程以實際產品為案例,詳細講解每個產品的開發全流程。此次首發內容是《手把手教你做PC-
    的頭像 發表于 01-06 20:46 ?116次閱讀
    《<b class='flag-5'>手把手</b><b class='flag-5'>教你</b>做PC》課程即將啟動!深開鴻引領探索KaihongOS筆記本電腦開發實戰

    【「具身智能機器人系統」閱讀體驗】2.具身智能機器人的基礎模塊

    具身智能機器人的基礎模塊,這個是本書的第二部分內容,主要分為四個部分:機器人計算系統,自主機器人的感知系統,自主機器人的定位系統,自主機器人
    發表于 01-04 19:22

    源碼開放 智能監測電源管理教程寶典!

    源碼開放,今天我們學習的是電源管理系統的核心功能模塊,手把手教你如何通過不同的技術手段實現有效的電源管理。
    的頭像 發表于 12-11 09:26 ?314次閱讀
    源碼開放  智能監測電源管理教程寶典!

    Air780E模組LuatOS開發實戰 —— 手把手教你搞定數據打包解包

    本文要說的是低功耗4G模組Air780E的LuatOS開發實戰,我將手把手教你搞定數據打包解包。
    的頭像 發表于 12-03 11:17 ?241次閱讀
    Air780E模組LuatOS開發實戰 —— <b class='flag-5'>手把手</b><b class='flag-5'>教你</b>搞定數據打包解包

    鴻蒙機器人與鴻蒙開發板聯動演示

    鴻蒙機器人與鴻蒙開發板聯動演示,機器人的角色為迎賓機器人,開發板負責人賓客出現監聽
    發表于 12-02 14:55

    手把手教你如何自制目標檢測框架

    今天,給大家分享一篇來自知乎的一篇關于目標檢測相關的一些內容, 本文基于Pytorch進行編寫。
    的頭像 發表于 11-14 16:39 ?250次閱讀
    <b class='flag-5'>手把手</b><b class='flag-5'>教你</b>如何<b class='flag-5'>自制</b>目標檢測框架

    七騰機器人:防爆輪式機器人-四輪八驅全新上線

    今日,七騰機器人有限公司(以下簡稱“七騰機器人”)推出全新產品:防爆輪式機器人-四輪八驅。該款產品是七騰輪式巡檢
    的頭像 發表于 10-21 16:32 ?221次閱讀
    七騰<b class='flag-5'>機器人</b>:防爆<b class='flag-5'>輪式</b><b class='flag-5'>機器人</b>-四輪八驅全新上線

    手把手教你通過宏集物聯網工控屏&amp;網關進行協議轉換,將底層PLC/傳感器的數據轉換為TCP協議并傳輸到用戶

    手把手教你通過宏集物聯網工控屏&網關進行協議轉換,將底層PLC/傳感器的數據轉換為TCP協議并傳輸到用戶終端
    的頭像 發表于 08-15 13:29 ?596次閱讀
    <b class='flag-5'>手把手</b><b class='flag-5'>教你</b>通過宏集物聯網工控屏&amp;網關進行協議轉換,將底層PLC/傳感器的數據轉換為TCP協議并傳輸到用戶

    Al大模型機器人

    金航標kinghelm薩科微slkor總經理宋仕強介紹說,薩科微Al大模型機器人有哪些的優勢?薩科微AI大模型機器人由清華大學畢業的天才少年N博士和王博士團隊開發,與同行相比具有許多優勢:語言
    發表于 07-05 08:52

    手把手教你在orcad中設置CIS元器件數據庫,提高工作效率

    元器件數據庫,就是實現上述查找元件、放置元件時所需要調用的數據庫。本文將手把手教你如何在orcad中配置CIS元器件數據庫。
    的頭像 發表于 06-15 17:27 ?6564次閱讀
    <b class='flag-5'>手把手</b><b class='flag-5'>教你</b>在orcad中設置CIS元器件數據庫,提高工作效率

    手把手教你排序算法怎么寫

    今天以直接插入排序算法,給大家分享一下排序算法的實現思路,主要包含以下部分內容:插入排序介紹插入排序算法實現手把手教你排序算法怎么寫在添加新的記錄時,使用順序查找的方式找到其要插入的位置,然后將
    的頭像 發表于 06-04 08:03 ?746次閱讀
    <b class='flag-5'>手把手</b><b class='flag-5'>教你</b>排序算法怎么寫

    手把手帶你移植HAL庫函數

    開發者更高效地進行嵌入式開發。手把手帶你移植HAL庫函數HAL庫提供了一套抽象接口,使開發者無需直接操作底層硬件寄存器,就能實現對硬件的控制。這種抽象使得代碼能夠更
    的頭像 發表于 05-18 08:04 ?2060次閱讀
    <b class='flag-5'>手把手</b>帶你移植HAL庫函數

    防爆輪式巡檢機器人作用和優勢?

    在當今的工業領域,安全生產始終是至關重要的議題。而在一些具有爆炸風險的環境中,如石油、化工、燃氣等行業,傳統的人工巡檢方式面臨著諸多挑戰。然而,隨著科技的飛速發展,防爆輪式巡檢機器人應運而生,為這些
    的頭像 發表于 04-23 17:17 ?698次閱讀
    防爆<b class='flag-5'>輪式</b>巡檢<b class='flag-5'>機器人</b>作用和優勢?

    農業輪式機器人三維環境感知技術研究進展

    子科技集團公司第五十四研究所等多家科研機構,開展了針對農業輪式機器人三維環境感知技術的研究。 作為未來農機裝備的研究重點,農業輪式機器人正向著智能化與多功能化的方向發展。三維環境感知技
    的頭像 發表于 02-22 17:05 ?427次閱讀
    主站蜘蛛池模板: 97免费人妻在线观看| 欧美高清videosgratis高| 国精产品一区二区三区有限公司 | 一抽一出BGM免费50分动漫| 8x8x我要打机飞在线观看| 国产精品玖玖玖影院| 墨西哥美女主播| 视频成人app永久在线观看| 制服国产欧美亚洲日韩| 亚洲天堂久久久| CHINSEFUCKGAY无套| 国语自产精品一区在线视频观看| 美女诱点第6季| 亚洲国产成人精品不卡青青草原| MD传媒MD0021在线观看| 久久久精品免费免费直播| 国内精品免费视频精选在线观看| 男人天堂2018亚洲男人天堂| 亚洲视频在线观看| 国产精品大陆在线视频| 欧美XXXX69学生HD| 最新国产av.在线视频| 黑兽在线观看高清在线播放樱花| 少妇人妻偷人精品视蜜桃| 99热久久这里只有精品| 久久热精品18国产| 亚洲伊人国产| 好男人的视频在线观看| 午夜精品久久久久久99热蜜桃| 成人影片迅雷下载| 大香伊人中文字幕精品| 两性色午夜视频免费国产| 欧美日韩一二区旡码高清在线| 亚洲视频免费| 国产午夜精品鲁丝片| 台湾佬休闲中性娱乐网| 成人天堂资源WWW在线| 牛牛精品专区在线| 99re6久久热在线播放| 伦理片在线线手机版韩国免费观看 | 国产午夜精品理论片|