У меня есть такой код. Мне нужно, чтобы из USART_GetChar() значения вида STX200200ETX
управляли ШИМом. Первое "200" - это Y джойстика (от 100 до 300), аналогично и для второй "200", только по Х.
STX - символ начала того, из чего нужно читать, ETX - символ его окончания.
(Если просто в while(1) отправлять по условию символы, то оно работает.
типа, if(simbol =='q') {right= например, 200}; (symbol= USART_GetChar() ) )
Для кнопок там просто отправляет буквы на вкл и на откл.
Самое мне не ясное это как сделать так, чтобы изменялся шим на желаемом OCR...
Управляется таким джойстиком
https://play.google.com/store/apps/details?id=org.projectproto.btjoystick&hl=ru
Код: Выделить всё
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include "usart.h"
#include <stdio.h>
#define right OCR0
#define left OCR2
#define forward OCR1A
#define backward OCR1B
#define STX 0x01 // 0x02 // начало
#define ETX 0x09// 0x03//конец
unsigned char cmd[8] = {0, 0, 0, 0, 0, 0, 0, 0};
void pause(unsigned long i)
{
while (--i) asm("nop");
}
int main(void)
{
PORTD=0;
//DDRD=0xb0;
DDRD = 0xfc;
PORTB=0;
DDRB=0x08;
TCCR2 = 0b01100100;
TCCR0 = 0b01100100;
TCCR1A = 0b10100001;
TCCR1B = 0b11100010;
USART_Init();
asm("sei");
while(1)
{
if(USART_GetChar()>0) // в скетче ардуино тут Serial.available()
{
// data received from smartphone
_delay_ms(20);
cmd[1] = USART_GetChar(); // в скетче ардуино тут Serial.read()
if(cmd[0] == STX)
{
int i=1;
while(USART_GetChar()>0) // в скетче ардуино тут Serial.available()
{
left = cmd[2];
_delay_ms(10);
cmd[i] = USART_GetChar(); // в скетче ардуино тут Serial.read()
if(cmd[i]>127 || i>7) break; // Communication error
if((cmd[i]==ETX) && (i==2 || i==7)) break; // Button or Joystick data
i++;
}
if (i==2) getButtonState(cmd[1]); // 3 Bytes ex: < STX "C" ETX >
if(i==7) getJoystickState(cmd); // 6 Bytes ex: < STX "200" "180" ETX >
} } } }
void getJoystickState(unsigned char data[8])
{
float vmax; int vmd; int vmi; float perc;
int joyX = (data[1]-48)*100 + (data[2]-48)*10 + (data[3]-48); // obtain the Int from the ASCII representation
int joyY = (data[4]-48)*100 + (data[5]-48)*10 + (data[6]-48);
joyX = joyX - 200; // Offset to avoid
joyY = joyY - 200; // transmitting negative numbers
if(joyX<-100 || joyX>100 || joyY<-100 || joyY>100) return; // commmunication error
if ((joyX == 0) && (joyY == 0)) {
// motorI.run(RELEASE);
// motorD.run(RELEASE);
return;
}
if (joyY > 0) {
// motorI.run(FORWARD);
// motorD.run(FORWARD);
vmax = joyY * 255 / 100 ;
} else {
// motorI.run(BACKWARD);
// motorD.run(BACKWARD);
vmax = -joyY * 255 / 100 ;
}
if (joyX == 0) {
vmd = (int) vmax;
vmi = (int) vmax;
}
else if(joyX > 0) {
perc = (100.0 - (float) joyX ) / 100.0;
vmd = (int) (vmax * perc);
vmi = (int) vmax;
}
else if(joyX < 0) {
perc = (100.0 + (float) joyX ) / 100.0;
vmi = (int) (vmax * perc);
vmd = (int) vmax;
}
//motorI.setSpeed(vmi);
//motorD.setSpeed(vmd);
}
void getButtonState(int bStatus) {
switch (bStatus) {
// ---------- BUTTON #1 ----------
case 'A':
PORTC = 0x01;
break;
case 'B':
PORTC =0x00;
break;
}
}
В usart.h заголовки такие:
Код: Выделить всё
void USART_Init(void); //инициализация usart`a
unsigned char USART_GetTxCount(void); //взять число символов передающего буфера
void USART_FlushTxBuf(void); //очистить передающий буфер
void USART_PutChar(unsigned char sym); //положить символ в буфер
void USART_SendStr(char * data); //послать строку по usart`у
unsigned char USART_GetRxCount(void); //взять число символов в приемном буфере
void USART_FlushRxBuf(void); //очистить приемный буфер
unsigned char USART_GetChar(void); //прочитать приемный буфер usart`a