Как связать ПК с контроллером ATmega

Ранее я делал схему для связи любого ПК с МК. Теперь рассмотрим как все это выглядит со стороны контроллера и со стороны ПК.

Сторона контроллера

2013-03-29 22.36.32

Для контроллера это простой UART. Когда компьютер посылает какие-либо данные контроллер вызывает прерывание и дальше мы обрабатываемым эти данные. Для этого лучше написать 2 простые функции.

void USART_Init(){
	//UCSRA=(1<<U2X);
	UCSR0B=(1<<RXCIE0)|(1<<RXEN0)|(1<<TXEN0)|(1<<TXB80)|(1<<RXB80);
	//UCSRC=(1<<UCPOL);
	UBRR0H=0;//
	UBRR0L=1;//bound
	//TXD/PD1 - Output
	DDRD |= (1<<PD1);
}
void transmitUART(unsigned char data_){
	while( !(UCSR0A&(1<<UDRE0)) );
	UDR0 = data_;
}

И все остальное можно обрабатывать в прерывании примерно так

ISR(USART_RX_vect){
	transmitUART(UDR0);
	switch(usartBuffer){
		case 0x31:
			if(n==0){
				PORTB |= (1<<PB1);
				PORTB &= ~(1<<PB2);
				n=1;
			}else{
				PORTB |= (1<<PB2);
				PORTB &= ~(1<<PB1);
				n=0;
			}
		break;
		default:
			// DEFAULT OP
		break;
	}
}

Что-бы общение было хоть как-то осмысленным принимаем что первый принятый байт посылки - команда, а дальше действуем по желаемой модели. Например команда 0×31 ( ASCII = 1 ) будет переключать светодиоды на контроллере.

Вот и все, теперь можно переходить к ПО для ПК.

Сторона ПК

Снимок3

Тут я выбираю, наверное, самое простое решение. Опен соурс SharpDevelop, очень удобен и все необходимое включено, при том без танцев с бубном.

И так, C# это совсем не тоже самое что С/С++, но все же Си.

Нам нужна будет библиотека работающая с периферией, называется она так

using System.IO.Ports;

Дальше создается экземпляр класса, настраиваем его и можно отправлять посылки.

public static SerialPort serialPort1 = new SerialPort();
serialPort1.PortName = "COM4"; //Указываем наш порт
serialPort1.BaudRate = 256000;//9600; //указываем скорость.
serialPort1.DataBits = 8; 
serialPort1.Open(); //Открываем порт.

//Событие вызовется когда получены данные
serialPort1.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler_);

//Посылаем контроллеру информацию
serialPort1.WriteLine("1");//0x31

Всяческие приблуды в виде оконного приложения и обработки нажатия на кнопку не буду рассматривать.

 

PS: Подытожу. На ПК запускается приложение в котором описана логика взаимодействия пользователя с периферийным устройством, это приложение посылает/принимает информацию от устройства.

Сервопривод HXT 900 с ATmega 8

Решил я попробовать как-то раз подключить сервопривод к контроллеру. Дело с такими вещами я раньше не имел, так что купил первую попавшуюся машинку.

Далее пошел копать на нее мануал, но оказалось это дело непростое. Сам производитель поскупился, и написал всего лишь 1 листочек. Hextronik_HXT900_datasheet. Поиски по разным форумам помогли найти мне электрическую схему.

Servo HXT900

 HXT900 с ATmega8 (не пугаться, на макете много лишнего)

 Приведу некоторые важные параметры

  • Напряжение питания: 4.8 – 6 В (но говорят можно и от 9В питать, правда дольше он от этого не прослужит, на деле питал от 3.3В все ОК)
  • Потребляемый ток: Очень долго искал, и только на одном форуме между строк нашел 700 мА, кажется мне, это враки, ибо от USB (500 мА), он работает у меня прекрасно. Источник на изи элктроникс говорит, что до 100 мА. Лично я намерил 180 мА максимум
  • Крутящий момент: 1.5 кг см2
  • Угол поворота: 90 градусов

Теперь о том как им управлять.

  • Коричневый провод – земля
  • Красный – питание
  • Желтый – сигнальный (должно быть не меньше 3.3 В)

Везде говорят, что это простой ШИМ, но верить им не стоит. Несущая частота 50 Гц (20 мс), и положение вала задается шириной импульса. От 0.45 мс ( 2222.2[2] Гц ) до 2.45 мс ( ~408.16 Гц ).

На деле несущая частота ШИМ может быть любой, но не меньше чем ширина импульса крайнего правого положения.

  1. Если частота например 1 Гц, то он 1 раз в секунду будет поворачивать вал на небольшой угол, и так пока не придет к заданному значению.
  2. Если частота будет 200 Гц, то отклик и жесткость выросте (когда на сигнальной линии пусто, то ротор двигателя можно спокойно вращать), но так же упадет крутящий момент.

servo_pulse

 

Примерно так выглядит сигнальная линия

С точки зрения программирования, эта задача очень простая. И даже не стоит того, чтобы занимать аппаратный ШИМ. Так как в приложениях с этим приводом скорее всего он будет не один, а ШИМ один, думаем как сделать все ручками.

Проще всего сделать это с помощью таймера.

В теле задаем делитель и запускаем таймер, так же разрешаем прерывание. (у меня 12 МГц кристалл, делитель не установлен)

sei(); 
TCCR0 |= (0<<CS02)|(1<<CS00); 
TIMSK |= (1<<TOIE0);

и в прерывании уже доводим до частоты. (данный код раз в секунду двигает вал в другое крайнее положение)

ISR (TIMER0_OVF_vect) {
 if(i>j)//(24) 47 - 94 (118) // через столько переполнений пройдет 0.45 и 2.45 мс соответственно, в скобках дествительные
 PORTB &=0;
 if(i>938){//50Гц - это 938 пререполнений таймера при частоте 12 МГц
 PORTB |=(1<<PB1)|(1<<PB2)|(1<<PB0); // 2 диода и серво
 i=0;
 }
 if(bo>46875){ // 1 секунда // каждую секунду меняет задающее значение ротора.
 if(j==24)
 j=118;
  else
 j=24;
 bo=0;
 }
 bo++;
 i++;
}

Можно все это хорошенько формализовать и сделать хоть для каждой ноги, и на каждую прицепить сервопривод.

Напоследок, видео

Полезные ссылки:

Программатор для AVR своими руками

Первое c чего начинает каждый решивший начать изучать микроконтроллеры это программатор. И так, поискав я нашел вариант полностью меня устроил. Спасибо PROTTOSS. Все инструкции к этому устройству можно найти там же. Здесь же будет рассказано о том как это сделал я.

IMG_0461

Готовый макет.

Для начала, почему именно он?

Наверное вы уже заметили, что с ПК он связан через USB, а другие  наиприятнейшие варианты требуют наличия LTP порта (6 проводов). Хотя, к нему мы еще вернемся.

Почему не USBasp?

Вот тут как говорится, что первое под руку попало=)

Хотя в защиту своего выбора могу заметить, что по данным сайта разработчика, USBasp поддерживается на:

  • AVRDUDE
  • BASCOM-AVR
  • Khazama AVR Programmer
  • eXtreme Burner – AVR

А AVR910:

  • AVRProg v.1.4,
  •  ChipBlasterAVR v.1.07 Evaluation,
  •  CodeVisionAVR,
  • AVROSP (ATMEL AVR Open Source Programmer)

И если вы хотите идти по праведному пути, и использовать AVRStudio или на худой конец CV AVR, то выбор очевиден.

Вступление

Для этого программатора, как и для всех рукодельных присуща философская проблема, курицы и яйца. Что-бы сделать программатор надо иметь программатор. А вот в случае с 6 проводным, все просто. Так что прежде чем начинать, убедитесь в существовании LTP порта в доступной близости или же наличие друзей, коллег, однокурсников имеющих готовый программатор.

Для любителей сделать все красиво ЛУТ в руки, я же хотел проверить для начала будет это вообще работать или нет. Так что купил просто однослойную макетку.

И так, что нам нужно?

Посмотрим на схему нам предлагаемую

shematic

 

Вот что нам надо будет закупить:

  1. MINI USB ( я ставил обычный и в результате куча проблем, мини лучше спаяется и проводов таких у всех дома навалом )
  2. Провод USB <-> MINI USB
  3. Разъем ISP на 10 ног ( вообще 10 ногий выход не используется на макетных платах ATmega и Tiny, но на 6 ног всегда можно сделать переходник )
  4. Контроллер Atmega8 ( купил сразу 2, 1- в программер, а другой будем уже использовать)
  5. Светодиодов 3шт ( когда разных цветов – веселее, опять же лучше с запасом для своей платы, выбираем их по току не меньше 10мА )
  6. Сопротивления 330 Ом, 100 Ом, 1.5 кОм, 10 кОм, 1 МОм
  7. Конденсаторы … все как обычно, только не забываем С5 - электролитический (банка) на 10В
  8. Кварц 12 МГц
  9. Джампер и 3 штырьки под него

J3 мне не пригодился а вот J1/J2 понадобится при программировании самого программатора

Файл прошивки и драйвер есть все на сайте PROTTOSS.COM

Там же заявлено, что его видят практически все кто мне нужно, но к нему подключиться смог только CVAVR, в прочем это не мешает писать код в AVRStudio компилировать и прошивать через CVAVR.

Шаг 1: Пайка

2013-07-30 13.33.02

 

На фото видно обратную сторону. Все элементы находятся на одной стороне, а пайка их с обратной. Для более продвинутых пользователей паяльника, но все еще ленивые, можно использовать SMD компоненты.

Шаг 2: Прошивка

Возможно одного энтузиазма будет мало, для прошивки программатора надо будет, если у вас нет COM или LTP порта на компьютере. Хотя для отчаянных есть еще такой вариант (Моя платка с использованием этого чипа).

В любом случае прошивается через PonyProg

Шаг 3: Тестируем

 

Альтернативные программаторы

PS: Подробнее о совместимости с AVRStudio