роботы робототехника микроконтроллеры


 Страниц (5): « 1 [2] 3 4 5 »   

> Описание: просто робокоп
ОЛЕГ Супермодератор Post Id



Супермодератор


Сообщений всего: 1732
Дата рег-ции: Нояб. 2008  



Ну, собственно, КРУТО! Улыбка
 
 Top
darkblue Супермодератор Post Id



Супермодератор


Сообщений всего: 403
Дата рег-ции: Нояб. 2008  



Ну собственно соглашусь с Олегом,вообще надо сделать веточку для выкладывания проектов ,схем к ним и прошивки ,ато я с этим вики час сидел ума всё равно не хватило сделать что-то
 
 Top
ОЛЕГ Супермодератор Post Id



Супермодератор


Сообщений всего: 1732
Дата рег-ции: Нояб. 2008  



Да это не я предлагал, кто-то другой, не помню.

Я в вики даже не полез. Голливудская улыбка
 
 Top
clockworck Post Id



Лейтенант


Сообщений всего: 25
Дата рег-ции: Янв. 2009  



Дорогие друзья ну подскажите пожалста, как разнообразить поведение робота, как например в си осуществить случайный выбор направления движения, и т.д и т.п.
А еще не скажите для чего нужны переменные которые указаны в программе к роботу на мк,где статья про вращение моторами вперед назад? у меня схема как там: л293д припаяна к тем же выводам мк, у меня так же все те-же номиналы конденсаторов и датчик висит на ноге pd1.Ну я беру и копирую вот это в робота


/*******************************************************
ПРИМЕР 1 :: ВРАЩЕНИЕ МОТОРАМИ ВПЕРЕД-НАЗАД :: MYROBOT.RU
********************************************************/

#include <avr/io.h>

/***************** Функция задержки ****************/
void delay(unsigned short ms) // Минимальная задержка с кварцем 8 МГц - 1 мс
{
unsigned short i, j, k; // объявляем переменные

for (i=0; i<ms; i++) // главный цикл формирования задержки
for (j=0; j<185; j++) // вложенный цикл формирования задержки
k++; // произвольное действие
}
/****************************************************/


int main(void) // начало основной программы
{

DDRC = 0xff; // все выводы порта C сконфигурировать как выходы

while (1) { // Бесконечный цикл

// ---------- вращаем моторы вперед 1 сек ----------

PORTC |= _BV(PC1); // установить "1" на линии 1 порта C
PORTC &= ~_BV(PC2); // установить "0" на линии 2 порта C
PORTC |= _BV(PC3); // установить "1" на линии 3 порта C
PORTC &= ~_BV(PC4); // установить "0" на линии 4 порта C

delay(1000); // ждем 1 сек.
// -------------------------------- ------------------


// ---------- вращаем моторы назад 1 сек ----------

PORTC &= ~_BV(PC1); // установить "0" на линии 1 порта C
PORTC |= _BV(PC2); // установить "1" на линии 2 порта C
PORTC &= ~_BV(PC3); // установить "0" на линии 3 порта C
PORTC |= _BV(PC4); // установить "1" на линии 4 порта C

delay(1000); // ждем 1 сек.
// -------------------------------- ------------------


} // закрывающая скобка бесконечного цикла

} // закрывающая скобка основной программы



у меня ни чего не работает. -я очень растраиваюсь и стераю малопонятные строки с переменными ,и о чудо все работает, еще меняю конечно delay(1000) на _delay_ms();
так зачем сдесь переменные?
 
 Top
бот_м_16 Супермодератор Post Id



Супермодератор


Сообщений всего: 1033
Дата рег-ции: Окт. 2008  



Переменные для задержки но этот способ сильно не спортивен и не по джедайски лучше на таймере! Ухмылка
Разнообразие - генерируем псевдо случайное число и в зависимости от его значения выбираем напрпвление Голливудская улыбка
 
 Top
clockworck Post Id



Лейтенант


Сообщений всего: 25
Дата рег-ции: Янв. 2009  



бот_м_16 а не могли бы вы привести немного именно кодовых примеров, тк мои знания в си, да и в програмировании вообще ограничиваются этим сайтом из статей шаг за шагом и я чего-то смутно представляю как реализовать псевдо случайное число и таймер. Грустный
заранее спс)

(Отредактировано автором: 08 Марта, 2009 - 23:31:04)

 
 Top
бот_м_16 Супермодератор Post Id



Супермодератор


Сообщений всего: 1033
Дата рег-ции: Окт. 2008  



от понимания к действию
от теории к практике
Книги вам в помощь
ЗЫ
Совет начинающего начинающему попробуйте CVAVR Улыбка
 
 Top
Белый Волк Супермодератор Post Id



Супермодератор


Сообщений всего: 648
Дата рег-ции: Февр. 2007  



clockworck
Быстрый алгоритм создания псевдослучайного числа с равномерным распределением:

CODE:

long int x = 1234567089;
long int y = 2249273084;
long int z = 2075489025;
long int w = 1000000007;

unsigned int random(unsigned int max) //Возвращает целое случайное число от 0 до max-1
{
unsigned long t = x ^ (x << 11);
x = y;
y = z;
z = w;
return (w = (w ^ (w >> 19)) ^ (t ^ (t >> 8))) % max;
}


Алгоритм называется XorShift. Обеспечивает (2 в степени 128 - 1) период повторения.
Для того, чтобы выдаваемые случайные числа не повторялись после операции выключение/включение, следует сохранять в какой-либо момент времени в энергонезависимую память микроконтроллера x, y, z, w.
Однако, если делать это каждый раз при обращении к функции, несколько снизится производительность (время обращения к энергонезависимой памяти микроконтроллера для записи одного байта составляет миллисекунды, что иногда может оказаться критичным). Следует проводить такую операцию во время инициализации микроконтроллера при включении. Поскольку, для случая с домашним роботом, указанный период повторения неоправданно велик (10760801423071571527252030441 год по 1000 случайных чисел в секунду), можно записывать в энергонезависимую память только 4 байта, которые будут определять собой новые значения x, y, z и w для каждого нового перезапуска. Конечный код выглядит следующим образом:

CODE:

long int x = 1234567089;
long int y = 2249273084;
long int z = 2075489025;
long int w = 1000000007;

unsigned int random(unsigned int max) //Возвращает целое случайное число от 0 до max-1
{
unsigned long t = x ^ (x << 11);
x = y;
y = z;
z = w;
return (w = (w ^ (w >> 19)) ^ (t ^ (t >> 8))) % max;
}

void EEPROM_write(unsigned int address, unsigned char data)
{
while (EECR & (1 << EEWE));
EEAR = address;
EEDR = data;
EECR |= (1 << EEMWE);
EECR |= (1 << EEWE);
}

unsigned char EEPROM_read(unsigned int address)
{
while (EECR & (1 << EEWE));
EEAR = address;
EECR |= (1 << EERE);
return EEDR;

void random_init()
{
x = EEPROM_read(0);
y = EEPROM_read(1);
z = EEPROM_read(2);
w = EEPROM_read(3);
unsigned int tmp = 1051;
tmp = x = (tmp * 4153 + TCNT0 + x) % (42589);
tmp = y = (tmp * 4153 + TCNT0 + y) % (42589);
tmp = z = (tmp * 4153 + TCNT0 + z) % (42589);
tmp = w = (tmp * 4153 + TCNT0 + w) % (42589);
EEPROM_write(0, random(256));
EEPROM_write(1, random(256));
EEPROM_write(2, random(256));
EEPROM_write(3, random(256));
}


Для организации генерации реальных случайных чисел, можно измерить время в миллисекундах от момента включения робота до момента встречи им первого препятствия и присвоить это значение переменной tmp (вместо 1051), соответственно изменив код.

Код написан для AVR Studio, подходит без изменений для WinAVR.
 
 Top
clockworck Post Id



Лейтенант


Сообщений всего: 25
Дата рег-ции: Янв. 2009  



Белый Волк спасибо!,но я плохо понимаю как этим воспользоваться. куда конкретно мне это вставить? Смущение у меня Winavr
 
 Top
Белый Волк Супермодератор Post Id



Супермодератор


Сообщений всего: 648
Дата рег-ции: Февр. 2007  



Данную часть кода можно непосредственно вставлять в Ваш, выше, чем Вы впервые обратитесь к функции определения случайного числа.
Для того, чтобы воспользоваться этим, в функции main(), необходимо вызвать инициализацию генератора случайных чисел, записав

CODE:

random_init();


После чего, в любом месте программы, где необходимо случайное поведение робота, используйте конструкцию вида:

CODE:

switch(random(5)) //Оператор множественного выбора
{
case 0: PORTD = 3; //в случае, если случайное число равно 0, выполнить действие PORTD=3.
break;


case 1: PORTD = 2; //в случае, если случайное число равно 1
break;

case 2: PORTD = 1; //в случае, если случайное число равно 2
break;

default: PORTD = 0b00001110; //в случае, если случайное число равно любому другому, не указанному ранее в case числу
}


Суть использования в следующем: Вы получаете при помощи обращения к функции random(x) случайное число, которое лежит в диапазоне от 0 до x-1, затем рассматриваете возможные значения случайного числа и задаёте необходимые для каждого значения действвия.
Можете воспользоваться структурой if(){}else{}, вместо предложенной. Например, если стоит выбор, поворот направо или налево, можно использовать:

CODE:

if(random(2))
{//действия для поворота направо}
else
{//действия для поворота налево}
 
 Top
clockworck Post Id



Лейтенант


Сообщений всего: 25
Дата рег-ции: Янв. 2009  



Белый Волк я вставил, но у меня не компилирует- выдает ошибку о том,что проблема random_init(); и т.д я не могу понять . и еще не понятно что должно быть в скобках random_init(вот здесь?); я не прикалываюсь, я правда не понимаю)
 
 Top
Белый Волк Супермодератор Post Id



Супермодератор


Сообщений всего: 648
Дата рег-ции: Февр. 2007  



Выложите код, который Вы пытаетесь компилировать.
 
 Top
clockworck Post Id



Лейтенант


Сообщений всего: 25
Дата рег-ции: Янв. 2009  



#include <avr/io.h>
#include <avr/delay.h>
#define F_CPU 8000000UL // 8 MHz


/****************************************************/


int main(void) // начало основной программы
{
random_init();


while (1) {
switch(random(5)) //Оператор множественного выбора
{
case 0: PORTD = 3; //в случае, если случайное число равно 0, выполнить действие PORTD=3.
break;


case 1: PORTD = 2; //в случае, если случайное число равно 1
break;

case 2: PORTD = 1; //в случае, если случайное число равно 2
break;

default: PORTD = 0b00001110; //в случае, если случайное число равно любому другому, не указанному ранее в case числу
}



DDRC = 0xff;
DDRD = 0x00;



PORTD = 0xff;





if (!(PIND & (1<<PIND1)))
{

PORTC |= _BV(PC0);
_delay_ms(6);
PORTC &= ~_BV(PC0);
_delay_ms(6);


if(random(2))
{
PORTC |= _BV(PC1); // установить "1" на линии 1 порта C
PORTC &= ~_BV(PC2); // установить "0" на линии 2 порта C
PORTC |= _BV(PC4); // установить "1" на линии 3 порта C
PORTC &= ~_BV(PC3);
_delay_ms(49);
}

else
{
PORTC |= _BV(PC2); // установить "1" на линии 1 порта C
PORTC &= ~_BV(PC1); // установить "0" на линии 2 порта C
PORTC |= _BV(PC3); // установить "1" на линии 3 порта C
PORTC &= ~_BV(PC4);
_delay_ms(49);}


}
else
{




PORTC |= _BV(PC1); // установить "1" на линии 1 порта C
PORTC &= ~_BV(PC2); // установить "0" на линии 2 порта C
PORTC |= _BV(PC3); // установить "1" на линии 3 порта C
PORTC &= ~_BV(PC4);





}



} // закрывающая скобка бесконечного цикла

} // закрывающая скобка основной программы






Извините если полный бред
 
 Top
ОЛЕГ Супермодератор Post Id



Супермодератор


Сообщений всего: 1732
Дата рег-ции: Нояб. 2008  



ИФ и ЭЛС не по порядку стоят. Надо if, затем else.
Нельзя два раза подряд if.
 
 Top
Белый Волк Супермодератор Post Id



Супермодератор


Сообщений всего: 648
Дата рег-ции: Февр. 2007  



Вам необходимо изучить основы C и попробовать написать свою программу полностью самостоятельно.

Попробуйте такой вариант и сообщите о результатах:

CODE:

#include <avr/io.h>
#include <avr/delay.h>
#define F_CPU 8000000UL // 8 MHz


long int x = 1234567089;
long int y = 2249273084;
long int z = 2075489025;
long int w = 1000000007;

unsigned int random(unsigned int max) //Возвращает целое случайное число от 0 до max-1
{
unsigned long t = x ^ (x << 11);
x = y;
y = z;
z = w;
return (w = (w ^ (w >> 19)) ^ (t ^ (t >> 8))) % max;
}

void EEPROM_write(unsigned int address, unsigned char data)
{
while (EECR & (1 << EEWE));
EEAR = address;
EEDR = data;
EECR |= (1 << EEMWE);
EECR |= (1 << EEWE);
}

unsigned char EEPROM_read(unsigned int address)
{
while (EECR & (1 << EEWE));
EEAR = address;
EECR |= (1 << EERE);
return EEDR;
}

void random_init()
{
x = EEPROM_read(0);
y = EEPROM_read(1);
z = EEPROM_read(2);
w = EEPROM_read(3);
unsigned int tmp = 1051;
tmp = x = (tmp * 4153 + TCNT0 + x) % (42589);
tmp = y = (tmp * 4153 + TCNT0 + y) % (42589);
tmp = z = (tmp * 4153 + TCNT0 + z) % (42589);
tmp = w = (tmp * 4153 + TCNT0 + w) % (42589);
EEPROM_write(0, random(256));
EEPROM_write(1, random(256));
EEPROM_write(2, random(256));
EEPROM_write(3, random(256));
}

int main(void) // начало основной программы
{
random_init();
DDRC = 0xff;
DDRD = 0x00;
PORTD = 0xff;
while (1)
{
if (!(PIND & (1<<PIND1)))
{
PORTC |= _BV(PC0);
_delay_ms(6);
PORTC &= ~_BV(PC0);
_delay_ms(6);

switch(random(3)) //Оператор множественного выбора
{
case 0:
PORTC |= _BV(PC1);
PORTC &= ~_BV(PC2);
PORTC |= _BV(PC4);
PORTC &= ~_BV(PC3);
_delay_ms(49);
break;


case 1:
PORTC |= _BV(PC2);
PORTC &= ~_BV(PC1);
PORTC |= _BV(PC3);
PORTC &= ~_BV(PC4);
_delay_ms(49);
break;

case 2:
PORTC |= _BV(PC1);
PORTC &= ~_BV(PC2);
PORTC |= _BV(PC3);
PORTC &= ~_BV(PC4);
break;
}

}
} // закрывающая скобка бесконечного цикла

} // закрывающая скобка основной программы
 
 Top
Страниц (5): « 1 [2] 3 4 5 »
« Делаем роботов »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 





Powered by Exclusive Bulletin Board
ExBB FM 1.0 RC1 Smiles by Fool from Foolstown
  Яндекс.Метрика   Рейтинг@Mail.ru