Технический форум по робототехнике.
atew » 17 май 2012, 11:21
Добрый день.
Помогите написать программу на C++ или C для управления мобильным роботом Rover 5 с 2-мя энкодерами (pololu).
С помощью программы мы должны контролировать скорость и пройденный путь.
Т.е. самого робота у меня нету. программа должна дать возможность пользователю задавать скорость и растояние которое нужно проехать и перед нами должен выйти график с импульсами такого вида
или
никогда не занимался серьезно программированием на с++ тем более контроллеров
Последний раз редактировалось
atew 17 май 2012, 14:26, всего редактировалось 2 раз(а).
dccharacter » 17 май 2012, 12:12
жесть
купи себе этого робота, кока-колы и печенья, позови на вечеринку друзей-одноклассников, подключи к энкодеру осциллограф, и перед вами выйдет график с импульсами такого вида без всяких С/С++
atew » 17 май 2012, 12:47
dccharacter писал(а):жесть
купи себе этого робота, кока-колы и печенья, позови на вечеринку друзей-одноклассников, подключи к энкодеру осциллограф, и перед вами выйдет график с импульсами такого вида без всяких С/С++
нигде не могу его найти, а программу нужна как можно быстрее написать.
нашел готовую прогу на сайте
http://forum.pololu.com/viewtopic.php?t=484- Код: Выделить всё • Развернуть
#include <stdlib.h>
#include <avr/io.h>
#include <avr/interrupt.h>
//global variables: encoder position and direction of rotation
unsigned int enc_pos;
unsigned char enc_dir;
/*
PORTC Pin change interrupt service routine. Decodes the encoder.
For algorithm, see Scott Edwards article from Nuts&Volts V1 Oct. 1995
(righthand bit of old A,B) xor (lefthand bit of new A,B) => dir.
Increment or decrement encoder position accordingly
*/
ISR (PCINT1_vect) {
static unsigned char enc_last=0,enc_now;
enc_now = (PINC & (3<<4))>>4; //read the port pins and shift result to bottom bits
enc_dir = (enc_last & 1)^((enc_now & 2) >> 1); //determine direction of rotation
if(enc_dir==0) enc_pos++; else enc_pos--; //update encoder position
enc_last=enc_now; //remember last state
}
#include "lcd.c"
int main(void)
{
unsigned char buf[8];
enc_pos=0; //Initialize encoder position
LCDInit(); //Initialize LCD display
DDRC &=~(3<<4); //Port C pins 4 and 5 as input
PCMSK1 |= (3<<PCINT12); //enable interrupt on pin change, bits 4&5 PORTC
PCICR |= 1<<PCIE1; //enable interrupt on pin change, PORTC
sei(); //enable global interrupts
while (1){
LCDSendCommand(LCD_Line1); //display current direction of rotation on line 1
itoa(enc_dir,buf,10);
LCDPrintString(buf);
LCDSendCommand(LCD_Line2); //display current encoder position on line 2
itoa(enc_pos,buf,10);
LCDPrintString(buf);
}
}
но её нужно прошить в робот, как я понял робот будет определять пройденный пусть и двигаться с заданной скоростью?!
RootAdmin » 17 май 2012, 17:50
Скорее всего просто выводить на экран состояние энкодеров. И все.
atew » 18 май 2012, 10:59
RootAdmin писал(а):Скорее всего просто выводить на экран состояние энкодеров. И все.
да, а но как, если нету энкодера под рукой, нужно эмулятор сделать что ли...
RootAdmin » 18 май 2012, 16:59
NeON79 » 20 май 2012, 02:29
Сессии пошли ,что ли? ТС, объясните, как проводить отладку на железе, не имея оного? Симуляторы не в счёт.