新的开始 day1

I spend all my bachelor & master time to learn to code and study machine vision stuff. Now, as a Phd candidate, my career changed to SLAM robotics, which is quite exciting. I finally jumped out of the boundary of coding and started to do some real welding and soldering. It is not easy, btw, for me, a computer since student to pick all these EE knowledge. But its lot of fun and getting paid. I would say fair enough

这几天开始看slam小车的构造,从硬件的角度。
以前从未接触过硬件这边,最多只玩过树莓派。

感觉从硬件上说,一个小车/机器人由底盘和各种传感器再加上一个ROS组成。
传感器与ROS都比较好理解。对我而言,反而车的底盘成了最神秘的部分。经过一天的阅读,我对底盘的理解有以下几个部分构成:

  1. 电机 motor
  2. 编码器 encoder
  3. 驱动板
  4. 上层控制电脑 这里可以是树莓派之类,也可以是笔记本电脑之类
  5. 电源与电源控制板

在阅读中已经学习了PWM(Pulse Width Modulatio)的使用,并在树莓派上测试了一段模拟脉冲宽度调制的python代码,如下:
arduino 关于pwm的介绍

Sample Image Added via Markdown

#!/usr/bin/env python

import RPI.GPIO as GPIO
import time
import signal
import atexit

atexit.register(GPIO.cleanup)

servopin=21
GPIO.setmode(GPIO.BCM)
GPIO.setup(servopin,GPIO.OUT,initial=False)
p=GPIO.PWM(servopin,50)
p.start(0)
time.sleep(2)

while(True):
for i in range(0,360,10):
p.ChangeDutyCycle(12.5-5*i/360)
time.sleep(1)
for i in range(0,360,10):
p.ChangeCutyCycle(7.5-5*i/360)
time.sleep(1)

但是要注意这里代码对应的舵机是360度舵机,如果测试180度舵机,试试下面这段代码,写的更直接粗暴简单:

import RPi.GPIO as GPIO
import time
import signal
import atexit

atexit.register(GPIO.cleanup)

servopin1=23
servopin2=24
GPIO.setmode(GPIO.BCM)
GPIO.setup(servopin1,GPIO.OUT,initial=False)
GPIO.setup(servopin2,GPIO.OUT,initial=False)
p1=GPIO.PWM(servopin1,50)
p2=GPIO.PWM(servopin2,50)
p1.start(7.5)
time.sleep(1)

#while(True):
# for i in range(0,90,15):
# p1.ChangeDutyCycle(12.5-5*i/90)
# time.sleep(1)
# for i in range(0,90,15):
# p2.ChangeCutyCycle(7.5-5*i/90)
# time.sleep(1)
p1.ChangeDutyCycle(6.5)
time.sleep(1)
p1.ChangeDutyCycle(2.5)
time.sleep(1)
p1.ChangeDutyCycle(11.5)
time.sleep(1)

p2.start(7.5)
time.sleep(1)
p2.ChangeDutyCycle(6.5)
time.sleep(1)
p2.ChangeDutyCycle(2.5)
time.sleep(1)
p2.ChangeDutyCycle(11.5)
time.sleep(1)

在学习中我还是不太明白为何初始电位在7.5,逻辑倒是简单粗暴,实际的PWM值会根据你买的电机有多不靠谱而产生浮动,调整一下就好。

而且我感觉每次把电机转到最大角度,再拉回来,是不是就是业内统一的初始化方式? brute force initialization?

附送树莓派1GPIO对照表,如果你也在学这些,请选择没有占用的接口测试舵机。否则舵机会出现迷之抽搐。

/
# define from wiringPi.h
# 3.3V | | 5V
# 8/SDA | | 5V
# 9/SCL | | GND
# 7 | | 14/TX
# GND | | 15/RX
# 0 | | 18
# 2 | | GND
# 3 | | 23
# VCC | | 24
# MOSI/12 | | GND
# MISO/13 | | 25
# SCK/14 | | 8/CE0
# GND | | 9/CE19
#/

舵机并不是重点,主要是通过舵机了解PWM的运作原理。另外值得一提的是树莓派对PWM的控制没有arduino精准,抖动好像是正常的,毕竟这是模拟PWM电路,如果真的手动攒小车的话还是需要一块专业的PWM电机驱动板来完成这个过程再反馈给上层树莓派。这样操作的话貌似会稳定很多。

哎,伟大旅程的第一步。明天再看看编码器是咋回事儿~

加载评论框需要翻墙