第一步,我先将树莓派的系统安装好, 确定gcc编译器,GPIO口都能正常使用.这些操作大家都可以在design spark中搜到,此处就不细讲.
图2
第二步,准备一个小的马达,再到买一个L298N 电机驱动板. L298N是ST公司生产的一种高电压、大电流电机驱动芯片。该芯片采用15脚封装。主要特点是:工作电压高,最高工作电压可达46V;输出电流大,瞬间峰值电流可达3A,持续工作电流为2A;额定功率25W。
图3
将树莓派上的GPIO 0 1 2 3 分别接到电机驱动板上的IN1、IN2、IN3、IN4口.我们使用的马达连接驱动板后,IN1 IN2 是控制底盘左边的马达, IN3 IN4是控制底盘右边的马达. 控制的原理拿左边的电机来讲: 依次把驱动板的IN1~IN2置为高电平,就可以驱动马达,也就是说,要把树莓派的2个GPIO输出口依次置为高电平。例如,假设用0代表低电平,1代表高电平的话,GPIO 0、1口的电平第一次被置为1、0,第二次被置为0、1,持续下去,电机就会运作。
我修改好的代码如下:
#include
#include
#include
#include
#define CLOCKWISE 1
#define COUNTER_CLOCKWISE 2
void delayMS(int x);
void rotate(int* pins, int direction);
int main(int argc,char* argv[]) {
if (argc < 4) {
printf(Usage example: ./motor 0 1 2 3 \n);
return 1;
}
/* number of the pins which connected to the stepper motor driver board */
int pinA = atoi(argv[1]);
int pinB = atoi(argv[2]);
int pinC = atoi(argv[3]);
int pinD = atoi(argv[4]);
int pins[4] = {pinA, pinB, pinC, pinD};
if (-1 == wiringPiSetup()) {
printf(Setup wiringPi failed!);
return 1;
}
/* set mode to output */
pinMode(pinA, OUTPUT);
pinMode(pinB, OUTPUT);
pinMode(pinC, OUTPUT);
pinMode(pinD, OUTPUT);
int i;
delayMS(50); // wait for a stable status
for (i = 0; i < 500; i++) {
rotate(pins, CLOCKWISE);
}
return 0;
}
/* Suspend execution for x milliseconds intervals.
* @param ms Milliseconds to sleep.
*/
void delayMS(int x) {
usleep(x * 1000);
}
/* Rotate the motor.
* @param pins A pointer which points to the pins number array.
* @param direction CLOCKWISE for clockwise rotation, COUNTER_CLOCKWISE for counter clockwise rotation.
*/
void rotate(int* pins, int direction) {
int i=0;
int j=0;
for (i = 0; i < 2; i++) {
if (CLOCKWISE == direction) {
for (j = 0; j < 2; j++) {
if (j == i) {
digitalWrite(pins[3 - j], 1); // 控制GPIO 2 3为高电平
digitalWrite(pins[1 - j], 1); // 控制GPIO 0 1为高电平
} else {
digitalWrite(pins[3 - j], 0); // 控制GPIO 2 3为低电平
digitalWrite(pins[1 - j], 0 );// 控制GPIO 0 1为低电平
}
}
} else if (COUNTER_CLOCKWISE == direction) {
for (j = 0; j < 2; j++) {
if (j == i) {
digitalWrite(pins[j+2], 1); // 控制GPIO 2 3为高电平
digitalWrite(pins[j], 1); // 控制GPIO 0 1为高电平
} else {
digitalWrite(pins[j+2], 0); // 控制GPIO 2 3为低电平
digitalWrite(pins[j], 0); // 控制GPIO 0 1为低电平
}
}
}
delayMS(4);
}