Я потратил недели на управление двумя сервоприводами (SG90) с помощью WiringPi и программирования на C, есть три вещи, которые я рекомендую.
1. Использование BCM GPIO
вместо WiringPi Pin
, поскольку для управления более чем одним сервоприводом может потребоваться более одного контакта, например 1(WiringPi Pin
)/18(BCM GPIO
) для другого сервопривода. Для версии RPi3 B+ он дает доступ к двум каналам для аппаратного ШИМ. . Канал 0 на gpios 12/18 и канал 1 на gpios 13/19, это легко и не нужно беспокоиться о сопоставлении контактов, если вы используете BCM GPIO
.
2. Лучше убедитесь, что есть только одна программа доступа PWM. булавки за один раз. Основываясь на моем опыте, если вы обнаружите, что использование такой команды, как «gpio -g pwm 18 25
», работает, но в противном случае использование кода, такого как «pwmWrite(18, 25)
», не дает никаких ответов сервопривода, возможно, попробуйте «ps -A
», чтобы убедиться, что какая-либо другая программа пытается получить доступ к вашему сервоприводу. .
3. Последнее и самое сложное для меня, когда я выполняю pwmWrite(18, 25)
" на PWM. pin 18
, срабатывает та же инструкция на PWM. pin 12
, что означает, что pwmWrite(18, 25)
срабатывает pwmWrite(12, 25)
. в режим ввода и установите для них раскрывающийся список.
Для подробностей коды для управления двумя сервоприводами с ШИМ. Канал 0 на gpios 12/18.
Основная функция:
void servo_init() {
servo_open(0);
delay(DELAY_SERVO);
servo_open(1);}
и
void servo_open(int servo) {
switch (servo) {
case 0:
pullUpDnControl(SERVO_0, PUD_OFF);
pinMode(SERVO_0, PWM_OUTPUT);
pwmSetMode(PWM_MODE_MS);
pwmSetClock(PWM_CHANNEL_0_CLOCK);
pwmSetRange(PWM_CHANNEL_0_RANGE);
break;
case 1:
pullUpDnControl(SERVO_1, PUD_OFF);
pinMode(SERVO_1, PWM_OUTPUT);
pwmSetMode(PWM_MODE_MS);
pwmSetClock(PWM_CHANNEL_0_CLOCK);
pwmSetRange(PWM_CHANNEL_0_RANGE);
break;
default:
break;
}}
и
void servo_close(int servo) {
switch (servo) {
case 0:
pinMode(SERVO_0, INPUT);
pullUpDnControl(SERVO_0, PUD_DOWN);
break;
case 1:
pinMode(SERVO_1, INPUT);
pullUpDnControl(SERVO_1, PUD_DOWN);
break;
default:
break;
}}
и
void servo(int servo, int angle) {
switch (servo) {
case 0:
servo = SERVO_0;
break;
case 1:
servo = SERVO_1;
break;
default:
servo = -1;
break;
}
switch (angle) {
case 90:
value = 25;
break;
case -90:
value = 10;
break;
case 0:
value = 14;
break;
default:
break;
}
if (servo == -1) return;
pwmWrite(servo, value);}
Поворот одного сервопривода, подключенного к 18 (BCM GPIO)
Закройте другие, прежде чем вы собираетесь вращать один
servo_close(1);
delay(DELAY_SERVO);
Повернуть
servo(0, 90);
delay(3*DELAY_MAGIC);
servo(0, 0);
Сбросьте все сервоприводы к их начальным углам для исправления случайного дрожания сервоприводов.
delay(DELAY_SERVO);
servo_init();
Проверьте больше исходного кода и информацию о сервоприводе и датчике на Raspberry: МОЙ GitHub
person
牟家宏
schedule
15.07.2019