Я уже рассказывал про радиоуправляемую машинку (статья). Но там использовался готовый передатчик и приемник для самолетов. В этой статье описывается радиоуправление на основе модулей для ардуино.
Радиоуправляемой стала моя новая платформа. Про саму платформу лучше почитать в ранее опубликованных статьях (железо, электроника).
Для этого проекта были куплены радиомодули
Transceiver Module
Нужно две штуки. А лучше три.
Для пульта нужна arduino nano
Arduino Nano
Удобно использовать arduino nano вместе с шильдиком предназначенным для подключения различных сенсоров
Sensor Shield
Ещё для пульта нужен модуль с кнопочками
Keyboard Module
Подойдет и такая клавиатурка
Membrane Keypad
И проводочки
Female to Female Cable
Соединяется всё в соответствии с изложенными ниже инструкциями.
Arduino Nano --- Keyboard module
GND --- GND
D8 --- K1
D9 --- K2
D10 --- K3
D11 --- K4
Arduino Nano --- Transceiver module
VCC --- VDD
GND --- GND
RX --- TXD
TX --- RXD
К ардуино уно, установленной на платформе, радиомодуль подключается аналогичным образом.
Код для пульта
Код для платформы
Назначение кнопок пульта:
K1 --- движение вперед,
K2 --- движение назад,
K3 --- поворот налево,
K4 --- поворот направо.
Если не нажата ни одна кнопка, то платформа не двигается.
Модули обеспечивают связь в пределах метров пяти точно. На большем расстоянии не было возможности проверить.
Радиоуправляемой стала моя новая платформа. Про саму платформу лучше почитать в ранее опубликованных статьях (железо, электроника).
Для этого проекта были куплены радиомодули
Transceiver Module
Нужно две штуки. А лучше три.
Для пульта нужна arduino nano
Arduino Nano
Удобно использовать arduino nano вместе с шильдиком предназначенным для подключения различных сенсоров
Sensor Shield
Ещё для пульта нужен модуль с кнопочками
Keyboard Module
Подойдет и такая клавиатурка
Membrane Keypad
И проводочки
Female to Female Cable
Соединяется всё в соответствии с изложенными ниже инструкциями.
Arduino Nano --- Keyboard module
GND --- GND
D8 --- K1
D9 --- K2
D10 --- K3
D11 --- K4
Arduino Nano --- Transceiver module
VCC --- VDD
GND --- GND
RX --- TXD
TX --- RXD
К ардуино уно, установленной на платформе, радиомодуль подключается аналогичным образом.
Код для пульта
//////////////////////// // // Arduino Nano // //////////////////////// // // Sketch: Transmitter // #include <util/delay.h> void PORTB_Init( void ) { // Port B DDRB = 0b00000000; PORTB = 0b00001111; } void PORTC_Init( void ) { // Port C DDRC = 0b00000000; PORTC = 0b00000000; } void PORTD_Init( void ) { // Port D DDRD = 0b00000000; PORTD = 0b00000000; } void USART_Init( void ) { // Set baud rate (9600 bps) UBRR0H = 0x00; UBRR0L = 0x67; // Enable receiver and transmitter UCSR0B = (1<<RXEN0)|(1<<TXEN0); // Set frame format: 8 data, 1 stop bit UCSR0C = (1<<UCSZ01)|(1<<UCSZ00); } unsigned char USART_Receive( void ) { // Wait for data to be received while ( !(UCSR0A & (1<<RXC0)) ) ; // Get and return received data from buffer return UDR0; } void USART_Transmit( unsigned char data ) { // Wait for empty transmit buffer while ( !( UCSR0A & (1<<UDRE0)) ) ; // Put data into buffer, sends the data UDR0 = data; } void setup() { cli(); PORTB_Init(); PORTC_Init(); PORTD_Init(); USART_Init(); sei(); } void loop() { while (1) { if ( !(PINB & (1<<0)) ) { _delay_ms(80); USART_Transmit('f'); while ( !(PINB & (1<<0)) ) ; } else if ( !(PINB & (1<<1)) ) { _delay_ms(80); USART_Transmit('b'); while ( !(PINB & (1<<1)) ) ; } else if ( !(PINB & (1<<2)) ) { _delay_ms(80); USART_Transmit('l'); while ( !(PINB & (1<<2)) ) ; } else if ( !(PINB & (1<<3)) ) { _delay_ms(80); USART_Transmit('r'); while ( !(PINB & (1<<3)) ) ; } USART_Transmit('s'); _delay_ms(80); } } // // End // ////////////////////////
Код для платформы
//////////////////////// // // Arduino Uno // //////////////////////// // // Sketch: Receiver // const unsigned char IN1 = 12; const unsigned char IN2 = 11; const unsigned char IN3 = 10; const unsigned char IN4 = 9; void driver_init(void) { pinMode(IN1, OUTPUT); pinMode(IN2, OUTPUT); pinMode(IN3, OUTPUT); pinMode(IN4, OUTPUT); } void stop(void) { digitalWrite(IN1, LOW); digitalWrite(IN2, LOW); digitalWrite(IN3, LOW); digitalWrite(IN4, LOW); } void forward(void) { digitalWrite(IN1, LOW); digitalWrite(IN2, HIGH); digitalWrite(IN3, LOW); digitalWrite(IN4, HIGH); } void backward(void) { digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW); digitalWrite(IN3, HIGH); digitalWrite(IN4, LOW); } void left(void) { digitalWrite(IN1, LOW); digitalWrite(IN2, HIGH); digitalWrite(IN3, HIGH); digitalWrite(IN4, LOW); } void right(void) { digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW); digitalWrite(IN3, LOW); digitalWrite(IN4, HIGH); } void setup() { Serial.begin(9600); driver_init(); stop(); } void loop() { unsigned char data; if (Serial.available() > 0) { data = Serial.read(); if ( data == 's' ) stop(); if ( data == 'f' ) forward(); if ( data == 'b' ) backward(); if ( data == 'l' ) left(); if ( data == 'r' ) right(); } } // // End // ////////////////////////
Назначение кнопок пульта:
K1 --- движение вперед,
K2 --- движение назад,
K3 --- поворот налево,
K4 --- поворот направо.
Если не нажата ни одна кнопка, то платформа не двигается.
Модули обеспечивают связь в пределах метров пяти точно. На большем расстоянии не было возможности проверить.
Комментариев нет:
Отправить комментарий