实验

接下来先搞清楚怎么用单片机。

Hello world

先让单片机跑起来再说。习惯了操作系统下编程,第一次用单片机还真有些不习惯,担心遇到问题,不过比较顺利。这个程序用来点亮单片机上的一个 LED 。

代码:

int ledPin = 13; // LED connected to digital pin 13 void setup() { pinMode(ledPin, OUTPUT); // sets the digital pin as output }

void loop()

{ digitalWrite(ledPin, HIGH); // sets the LED on delay(1000); // waits for a second digitalWrite(ledPin, LOW); // sets the LED off delay(1000); // waits for a second }

以间隔 1000ms 的时间把单片机的第 13 个 Pin 脚循环输出高低电平,从而达到点亮和熄灭 LED 功能。很简单,就是验证下单片机是否可用。

控制舵机

舵机就是遥控模型上用来控制的,其实就是一个带闭环控制的电机,能转动到指定的角度。

工作原理是:控制信号由接收机的通道进入信号调制芯片,获得直流偏置电压。它内部有一个基准电路,产生周期为 20ms ,宽度为 1.5ms 的基准信号,将获 得的直流偏置电压与电位器的电压比较,获得电压差输出。



最后,电压差的正负输出到电机驱动芯片决定电机的正反转。当电机转速一定时,通过级联减速齿轮带动 电位器旋转,使得电压差为 0 ,电机停止转动。

在程序中控制舵机的转动角度,就是生成不同脉宽的 PWM 就行了。



上面的代码简单的生成一个 PWM 驱动舵机旋转,比较简单。 代码中用 delay 来实现延时,如果是同时控制多个舵机,用这样的代码是不行的,需要自己计算时间。因为用 delay 整个单片机都“休息”了,无法执行任何代码。在实际实现中,还需要不断的读取传感器输入和进行其他处理。

红外距离传感器

传感器介绍:

SHARP 红外距离传感器,用于模型或机器人制作,可以用来测量距离。每个模块赠送一根 15cm 长 PH2.0 的单头排线 .

技术规格:

探测距离: 10-80cm

工作电压: 4-5.5V

标准电流消耗: 33-50 mA

输出量:模拟量输出,输出电压和探测距离成比例


接好电源,把模拟信号输出端接在单片机的模拟输入 Pin 就行了。

测试代码:

int potPin = 2;

int ledPin = 13;

int val = 0;

void setup() {

pinMode(ledPin, OUTPUT);

}

void loop() {

val = analogRead(potPin);

digitalWrite(ledPin, HIGH);

delay(val);

digitalWrite(ledPin, LOW);

delay(val);

}

运行结果, led 随着传感器距离的变化闪烁间隔也随着变化。
控制电机

常用的直流电机使用 L293D 来控制,使用 H293 的电路如下:



不过在验证是发现,对于小电机,直接用单片机的 PWM 端子来输出不同电压的来控制速度也是可行的,虽然不太精确,但是对于实现运动特征是足够了。单片机无法输出真正的线性模拟电压, PWM 是通过调整空占比间隔来模拟不同电压值的。

测量了电机在空载和负载情况下电流都只有几十毫安,所以先采取这种简单的办法验证。


直接把电机接到单片机的 Gnd 和 PWM Pin 9 接口,然后在程序中直接向 Pin 9 输出就可以让电机运转了。

int value = 0; int ledpin = 9; void setup() { // nothing for setup } void loop() { for(value = 0 ; value <= 255; value+=5) { analogWrite(ledpin, value); delay(30); } for(value = 255; value >=0; value-=5) { analogWrite(ledpin, value); delay(30); } }

上面的程序用不同的输出值驱动电机,可以看到电机的旋转效果。

单片机和主要部件的验证基本就完成了,下一步要开始程序设计了。