Почему оно тормозит.. Ethernet shield w5100 (оригинал) + Arduino UNO
- Войдите на сайт для отправки комментариев
Чт, 06/12/2012 - 13:45
Добрый день, коллеги.
Написал скейтч для управления двумя сервами и моточиком впридачу. Подключил джойстик - все летает (даже скорость ограничил - видно в коде), как только дело касается приема данных через сеть - двигается все ужаснейшими рывками. Хотя, скорость должна быть большая. Помогите пожалуйста понять в чем косяк у меня.
#include <SPI.h>
#include <Ethernet.h>
#include <Servo.h>
byte mac[] = {
0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
IPAddress ip(192,168,1,190);
// local port to listen on
const int LOCAL_PORT = 9082;
// buffer for debug output
char buffer[64];
EthernetServer server(LOCAL_PORT);
EthernetClient client;
// PIN CONFIG
#define X_AXIS A0
#define Y_AXIS A1
#define Z_SW 7
#define M_FORWARD 5
#define M_BACKWARD 4
#define D_STOP 0;
#define D_UP 1;
#define D_DOWN 2;
#define D_LEFT 3;
#define D_RIGHT 4;
enum cmd {
UNKNOWN=0x00, MOVE_N=0x01,
MOVE_NE=0x02, MOVE_E=0x03,
MOVE_SE=0x04, MOVE_S=0x05,
MOVE_SW=0x06, MOVE_W=0x07,
MOVE_NW=0x08, PULL=0x09,
RELEASE=0x0A, SERVICE=0x0B,
STATUS=0x0C};
byte act = 0x00;
int POS_PLATFORM = 90;
int POS_CONSOLE = 90;
Servo S_PLATFORM;
Servo S_CONSOLE;
int POS_PLATFORM_MAX = 180;
int POS_PLATFORM_MIN = 0;
int POS_CONSOLE_MAX = 140;
int POS_CONSOLE_MIN = 30;
int POS_STEP = 5;
int X, Y;
void setup() {
Serial.begin(9600);
Ethernet.begin(mac,ip);
server.begin();
client.setTimeout(10);
Serial.println("INIT READY");
pinMode(Z_SW, INPUT);
pinMode(M_FORWARD, OUTPUT);
pinMode(M_BACKWARD, OUTPUT);
digitalWrite(M_FORWARD,0);
digitalWrite(M_BACKWARD,0);
S_PLATFORM.attach(2);
S_CONSOLE.attach(3);
}
int treatValue(int data) {
return (data * 9 / 1024);
}
void getJoyData(int &POS_PLATFORM, int &POS_CONSOLE)
{
int cX = treatValue(analogRead(X_AXIS));
int cY = treatValue(analogRead(Y_AXIS));
if(cY < 5 ) {
POS_CONSOLE = POS_CONSOLE - POS_STEP;
}
if(cY > 5 ) {
POS_CONSOLE = POS_CONSOLE + POS_STEP;
}
if(cX < 5 ) {
POS_PLATFORM = POS_PLATFORM - POS_STEP;
}
if(cX > 5 ) {
POS_PLATFORM = POS_PLATFORM + POS_STEP;
}
if(POS_PLATFORM <= POS_PLATFORM_MIN ) {
POS_PLATFORM = POS_PLATFORM_MIN;
}
if(POS_PLATFORM >= POS_PLATFORM_MAX ) {
POS_PLATFORM = POS_PLATFORM_MAX;
}
if(POS_CONSOLE <= POS_CONSOLE_MIN ) {
POS_CONSOLE = POS_CONSOLE_MIN;
}
if(POS_CONSOLE >= POS_CONSOLE_MAX ) {
POS_CONSOLE = POS_CONSOLE_MAX;
}
S_PLATFORM.write(POS_PLATFORM);
S_CONSOLE.write(POS_CONSOLE);
delay(15);
}
void loop()
{
getJoyData(*&POS_PLATFORM, *&POS_CONSOLE);
// listen for incoming clients
client = server.available();
if(client){
// Serial.println("--CLIENT");
while(client.connected()){
//Serial.println("--CONNECTED");
while(client.available()) {
char raw_len[1];
client.readBytes(raw_len, 1);
byte len = *(byte*)raw_len;
Serial.print(len);
Serial.println(" :CMD COUNT");
byte raw_act[len];
//client.readBytes(raw_act, len);
for(int i=0; i<len; i++)
{
if(i>=3){ client.flush(); }
//byte act = *(byte*)raw_act[i];
byte act = client.read();
int action = readCMD(act);
Serial.println(action);
switch((cmd)action)
{
case MOVE_N:
{
MoveConsoleUP();
//Serial.println("MOVE N");
break;
}
case MOVE_NE:
{
MoveConsoleUP();
MovePlatformRIGHT();
//Serial.println("MOVE NE");
break;
}
case MOVE_E:
{
MovePlatformRIGHT();
//Serial.println("MOVE E");
break;
}
case MOVE_SE:
{
MoveConsoleDOWN();
MovePlatformRIGHT();
//Serial.println("MOVE SE");
break;
}
case MOVE_S:
{
MoveConsoleDOWN();
//Serial.println("MOVE S");
break;
}
case MOVE_SW:
{
MoveConsoleDOWN();
MovePlatformLEFT();
//Serial.println("MOVE SW");
break;
}
case MOVE_W:
{
MovePlatformLEFT();
//Serial.println("MOVE W");
break;
}
case MOVE_NW:
{
MoveConsoleUP();
MovePlatformLEFT();
//Serial.println("MOVE NW");
break;
}
case PULL:
{
Serial.println("PULL");
Pull();
break;
}
case RELEASE:
{
Release();
Serial.println("RELEASE");
break;
}
case SERVICE:
{
Serial.println("SERVICE");
break;
}
case STATUS:
{
Serial.println("STATUS");
break;
}
default:
{
Serial.println("ACT UNKNOWN - DO NOTHING");
break;
}
}
Serial.print("POS CONSOLE: ");
Serial.println(POS_CONSOLE);
Serial.print("POS PLATFORM: ");
Serial.println(POS_PLATFORM);
S_PLATFORM.write(POS_PLATFORM);
S_CONSOLE.write(POS_CONSOLE);
}
}
}
delay(1);
client.stop();
Serial.println("--STOP");
}
}
// --------- commands ---------------
int readCMD(byte c)
{
cmd val;
if(c >= 0 || c <= 12) {
val = (cmd)c;
}
else {
val = UNKNOWN;
}
return val;
}
// ---------- ACTIONS -----------------
void MoveConsoleUP()
{
Serial.print("CON UP");
POS_CONSOLE = POS_CONSOLE + POS_STEP;
if(POS_CONSOLE >= POS_CONSOLE_MAX ) {
POS_CONSOLE = POS_CONSOLE_MAX;
}
}
void MoveConsoleDOWN()
{
Serial.print("CON DOWN");
POS_CONSOLE = POS_CONSOLE - POS_STEP;
if(POS_CONSOLE <= POS_CONSOLE_MIN ) {
POS_CONSOLE = POS_CONSOLE_MIN;
}
}
void MovePlatformRIGHT()
{
Serial.print("PL RIGHT");
POS_PLATFORM = POS_PLATFORM - POS_STEP;
if(POS_PLATFORM >= POS_PLATFORM_MAX ) {
POS_PLATFORM = POS_PLATFORM_MAX;
}
}
void MovePlatformLEFT()
{
Serial.print("PL LEFT");
POS_PLATFORM = POS_PLATFORM + POS_STEP;
if(POS_PLATFORM <= POS_PLATFORM_MIN ) {
POS_PLATFORM = POS_PLATFORM_MIN;
}
}
void Pull()
{
digitalWrite(M_BACKWARD,1);
}
void Release()
{
digitalWrite(M_FORWARD,1);
}
void StopMotor()
{
digitalWrite(M_FORWARD,0);
digitalWrite(M_BACKWARD,0);
}
Либы старнадтные, те что входят в комплект ардуино IDE. Ничего экстраординароного и все просто. Мой ли косяк аль что в коде эзернет либы, я вчера бегло погуглил - ругаются на нее сильно.
Буду рад любой помощи и замечаниям даже по качеству написанию кода.
Благодарю и доброго дня.
Сам отвечу. Дела в том что ардуино UNO просто не успевает обработать весь поток котрый приходит на сетевой чип визнет. По этому она обрабатывает все, но с задержками. Есть вариант использовать мегу - она пошустрее. На ней все более-менее сносно работает.
Сам отвечу. Дела в том что ардуино UNO просто не успевает обработать весь поток котрый приходит на сетевой чип визнет. По этому она обрабатывает все, но с задержками. Есть вариант использовать мегу - она пошустрее. На ней все более-менее сносно работает.
Или буфер для пакетов, принимаемых на wiz5100 традиционно мизерный... В enc28j60 было что-то порядка 50 байт по-умолчанию... wiz5100 лежит, но руки не дошли даже подключить и проверить.
Мининова, может поможите с проблемой? http://arduino.ru/forum/programmirovanie/arduino-ethernet-shield