ENC28J60 и Arduino Leonardo
- Войдите на сайт для отправки комментариев
Ср, 29/01/2014 - 15:19
Доброго времени суток.
Иемю в наличии Ардуино Леонардо и ENC28J16 Шилд. Нашёл единственную библиотеку и скеч который вообше удалось запустить. Брал здесь http://computer-service.pro/smf/index.php/topic,31.msg67.html#msg67 . Всё запускается. Захожу через браузер,и вижу там картину информация по Аналоговы выходам. И дигитальные выходы 3,5,6,7,8,9 значение которых я могу поменять, и в реале они меняются. На леонардо от шлда подkлючил SI, SO, GND, PCT, SCK включены к ICSP контактам. 2 и 10 контактк понятное дело заняты опять же таки шилдом. Вопрос следующий: Как мне воспользоваться контактами 4,11,12,13. В скетче ничего не нашёл как это сделать. Может они где то в библиотеке заблокированы? Но порылся по файлам библиотеки, ничего такого не увидел. Помогите пожалуйста разобраться.
Собственно сам код: // Present a "Will be back soon web page", as stand-in webserver. // 2011-01-30 <jc@wippler.nl> http://opensource.org/licenses/mit-license.php #include <EtherCard.h> #include <avr/eeprom.h> //int sensorValue = 0; // variable to store the value coming from the sensor #define CONFIG_EEPROM_ADDR ((byte*) 0x40) // configuration, as stored in EEPROM struct Config { byte group; byte debug; byte auto_dhcp; word refresh; byte valid; // keep this as last byte } config; // ethernet mac address - мак адрес должен быть уникальным для каждого устройства сети static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 }; static BufferFiller bfill; // used as cursor while filling the buffer byte Ethernet::buffer[1300]; // tcp/ip размер буфера static void loadConfig() { for (byte i = 0; i < sizeof config; ++i) ((byte*) &config)[i] = eeprom_read_byte(CONFIG_EEPROM_ADDR + i); // значения поумолчанию если group не равно 1 if (config.group != 1) { config.group = 1; config.debug = 1; config.auto_dhcp = 0; config.refresh = 5; } } static void saveConfig() { for (byte i = 0; i < sizeof config; ++i) eeprom_write_byte(CONFIG_EEPROM_ADDR + i, ((byte*) &config)[i]); } #define DEBUG 1 // set to 1 to display free RAM on web page #define SERIAL 1 // set to 1 to show incoming requests on serial port #define STATIC 1 // 1 выключает DHCP #if STATIC // ip адрес static byte myip[] = { 192,168,1,15 }; // ip адрес шлюза static byte gwip[] = { 192,168,1,1 }; #endif void setup(){ Serial.begin(57600); Serial.println("\n[myWEB_Server]"); /* выключение SD card 4pin*/ pinMode(4, OUTPUT); digitalWrite(4, HIGH); pinMode(9, OUTPUT); digitalWrite(9, LOW); pinMode(3, OUTPUT); digitalWrite(3, LOW); for (int i=5;i<=9;i++){ pinMode(i, OUTPUT); digitalWrite(i, LOW); } loadConfig(); Serial.print("MAC: "); for (byte i = 0; i < 6; ++i) { Serial.print(mymac[i], HEX); if (i < 5) Serial.print(':'); } Serial.println(); delay(2000); if (ether.begin(sizeof Ethernet::buffer, mymac,10) == 0) Serial.println( "Failed to access Ethernet controller"); Serial.println("Setting up DHCP"); #if STATIC ether.staticSetup(myip, gwip); #else if (!ether.dhcpSetup()) Serial.println("DHCP failed"); #endif ether.printIp("My IP: ", ether.myip); ether.printIp("Netmask: ", ether.mymask); ether.printIp("GW IP: ", ether.gwip); ether.printIp("DNS IP: ", ether.dnsip); } //------------------------------------ char okHeader[] PROGMEM = "HTTP/1.1 200 OK\r\n" "Content-Type: text/html\r\n" "Pragma: no-cache\r\n" ; static void homePage(BufferFiller& buf) { //--------------------------------------------- buf.emit_p(PSTR("$F\r\n" "<meta http-equiv='refresh' content='$D'; charset=\"utf-8\"/>" "<title>Web Server Arduino</title>"), okHeader, config.refresh); //--------------------------------------------- long t = millis() / 1000; word h = t / 3600; byte m = (t / 60) % 60; byte s = t % 60; buf.emit_p(PSTR( "Analog in<br/>" "<br/>")); for (int analogChannel = 0; analogChannel <=5; analogChannel++) { buf.emit_p(PSTR("<span>Analog in $D = $D</span><br/>"),analogChannel,analogRead(analogChannel)); } /*******************************************************************/ buf.emit_p(PSTR("<br>Digital out<br/><br/>")); buf.emit_p(PSTR("<span>Digital out $D = $D</span><A HREF ='IS$D"),3,digitalRead(3),3); if(digitalRead(3) == 1) buf.emit_p(PSTR("0")); else buf.emit_p(PSTR("1")); buf.emit_p(PSTR("'> Изменить</A>")); buf.emit_p(PSTR("")); buf.emit_p(PSTR("<br/>")); buf.emit_p(PSTR("<span>Digital out $D = $D</span><A HREF ='IS$D"),9,digitalRead(9),9); if(digitalRead(9) == 1) buf.emit_p(PSTR("0")); else buf.emit_p(PSTR("1")); buf.emit_p(PSTR("'> Изменить</A>")); buf.emit_p(PSTR("")); buf.emit_p(PSTR("<br/>")); for (int digitalChannel = 5; digitalChannel <= 9; digitalChannel++) { buf.emit_p(PSTR("<span>Digital out $D = $D</span><A HREF ='IS$D"),digitalChannel,digitalRead(digitalChannel),digitalChannel); if(digitalRead(digitalChannel) == 1) buf.emit_p(PSTR("0")); else buf.emit_p(PSTR("1")); buf.emit_p(PSTR("'> Изменить</A>")); buf.emit_p(PSTR("")); buf.emit_p(PSTR("<br/>")); } buf.emit_p(PSTR("</div></div></div></div></body></html>")); buf.emit_p(PSTR("<br/><br/><br/>" "- <a href='c'>configure</a> -<br/>" "<br/>")); } //------------------------------------ static int getIntArg(const char* data, const char* key, int value =-1) { char temp[10]; if (ether.findKeyVal(data + 7, temp, sizeof temp, key) > 0) value = atoi(temp); return value; } static void configPage(const char* data, BufferFiller& buf) { // pick up submitted data, if present if (data[6] == '?') { byte g = getIntArg(data, "g");// тут выискиваем переменные из формы byte d = getIntArg(data, "d", 0); byte c = getIntArg(data, "a", 0); word r = getIntArg(data, "r"); if (1 <= g && g <= 250 && 1 <= r && r <= 3600) { // присваиваем внутренним переменым новые значения config.group = g; config.debug = d; config.auto_dhcp = c; config.refresh = r; Serial.println(config.debug); saveConfig();//сохраненине новых настроек EEPROM loadConfig();// загрузка новых настроек из EEPROM // перенаправление на домашную страничку buf.emit_p(PSTR( "HTTP/1.0 302 found\r\n" "Location: /\r\n" "\r\n")); return; } } // else show a configuration form buf.emit_p(PSTR("$F\r\n" "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"/>" "<h3>Настройка Web Server ARDUINO</h3>" "<form>" "<p>"), okHeader); buf.emit_p(PSTR("Net group <input type=text name=g value='$D' size=3> (1..250)<br>" "Включение режима отладки: <input type=checkbox name=d value='1' $S><br> " "Получение IP по DHCP: <input type=checkbox name=a value='1' $S><br> " "Авто обновление страницы <input type=text name=r value='$D' size=4> (1..3600 секунд)" "</p>" "<input type=submit value=Set>" "</form>"), config.group, config.debug ? "CHECKED" : "", config.auto_dhcp ? "CHECKED" : "", config.refresh);//имена переменных выгледят так "name=r" #if DEBUG buf.emit_p(PSTR("<br>")); buf.emit_p(PSTR(" ($D bytes free)"), freeRam()); #endif } //========================================== void loop(){ word len = ether.packetReceive(); word pos = ether.packetLoop(len); // check if valid tcp data is received if (pos) { bfill = ether.tcpOffset(); char* data = (char *) Ethernet::buffer + pos; //#if SERIAL // Serial.println(data); //#endif // receive buf hasn't been clobbered by reply yet if (strncmp("GET / ", data, 6) == 0) homePage(bfill); else if (strncmp("GET /c", data, 6) == 0) configPage(data, bfill); else if (strncmp("GET /IS", data, 7) == 0) struktPage(data, bfill); else bfill.emit_p(PSTR( "HTTP/1.0 401 Unauthorized\r\n" "Content-Type: text/html\r\n" "\r\n" "<h1>401 Unauthorized</h1>")); ether.httpServerReply(bfill.position()); // send web page data } } static void struktPage(const char* data, BufferFiller& buf) { #if SERIAL Serial.println(data[8]); Serial.println(data[7]); #endif int nivel = 0; int porten = 0; if(data[8] == '0') { nivel = 0; } else { nivel = 1; } if (data[7] == '3') { digitalWrite(3, nivel); buf.emit_p(PSTR( "HTTP/1.0 302 found\r\n" "Location: /\r\n" "\r\n")); return; } else if (data[7] == '5') { digitalWrite(5, nivel); buf.emit_p(PSTR( "HTTP/1.0 302 found\r\n" "Location: /\r\n" "\r\n")); return; } else if (data[7] == '6') { digitalWrite(6, nivel); buf.emit_p(PSTR( "HTTP/1.0 302 found\r\n" "Location: /\r\n" "\r\n")); return; } else if (data[7] == '7') { digitalWrite(7, nivel); buf.emit_p(PSTR( "HTTP/1.0 302 found\r\n" "Location: /\r\n" "\r\n")); return; } else if (data[7] == '8') { digitalWrite(8, nivel); buf.emit_p(PSTR( "HTTP/1.0 302 found\r\n" "Location: /\r\n" "\r\n")); return; } else if (data[7] == '9') { digitalWrite(9, nivel); buf.emit_p(PSTR( "HTTP/1.0 302 found\r\n" "Location: /\r\n" "\r\n")); return; } else buf.emit_p(PSTR( "HTTP/1.0 401 Unauthorized\r\n" "Content-Type: text/html\r\n" "\r\n" "<h1>401 Unauthorized</h1>")); } #if DEBUG static int freeRam () { extern int __heap_start, *__brkval; int v; return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval); } #endif