ITEADUINO IBOARD и nRF24L01+?

ustas
Offline
Зарегистрирован: 12.03.2012

"не было у бабы забот - купила баба порося" (с)

Захотелось сделать кое-что полезное и расширить функциональность тех модулей, что уже дома "обжились".

Купил плату ITEADUINO IBOARD V1.1

Даташит тут: http://iteadstudio.com/store/images/produce/Platform/ArduinoCom/IBoard/iBoard_DS.pdf

Схемотехника тут: http://iteadstudio.com/store/images/produce/Platform/ArduinoCom/IBoard/sch-iboard.pdf

Первые грабли: отсутствие USB (но ничего, уже освоил прошивку через ISP)

С отладкой работы тоже грабли - последовательного порта-то нет :(... видимо, буду "моргать" светодидоами, повешенными на аналогвые выходы/выходы... 

Дальше вроде пошло чуть легче: завелся пример, который через веб отдает содержимое SD-карточки (включая вывод содержимого файла). Наверняка просто заведется и запись... 

А теперь собственно главная проблема.. как запустить беспроводной модуль (nRF24L01+)? Подключается через SPI (вообще, как и остальные составляющие на данной плате).

Во всех мануалах и примерах предлагается подключать этот модуль следующим образом:

* Pins:
* Hardware SPI:
* MISO -> 12
* MOSI -> 11
* SCK -> 13

* IRQ -> 2

* Configurable:
* CE -> 8
* CSN -> 7

Тут же (судя по схеме) все закоммутировано так:

* Pins:
* MISO -> 6
* MOSI -> 5
* SCK -> 7

* IRQ -> 2

* CE -> 3
* CSN -> 8

Интересно, можно ли это вообще заставить работать? Есть мысли? Или я где-то туплю?

 

leshak
Offline
Зарегистрирован: 29.09.2011

 >С отладкой работы тоже грабли - последовательного порта-то нет

http://arduino.cc/hu/Reference/SoftwareSerial не поможет?

>Тут же (судя по схеме) все закоммутировано так:

Вот ту что-то родственное описанно. http://www.elecfreaks.com/480.html, там же внизу есть ссылочка на софтверную реализацию SPI либы. Как я понимаю это именно что-бы можно было рулить на любых пинах. 

Можно еще попытася завести в ArduinoIDE новый тип платы, что-бы при ее выборе дефайны MISO, MOSI и т.п. соотвествовали схематике... но я не очень понимая как это заработает. В самом-то чипе железная реализация SPI на другие ноги не переедет... Да и потом при работе с SD картой может помешать.

 

 

ustas
Offline
Зарегистрирован: 12.03.2012

 SoftwareSerial поможет, думаю, если удастся заставить его работать на аналоговых входах... 

вообще, на плате есть последовательный интерфейс (выведены D0 и D1) - только надо будет девайс сделать (еще одну дуину задействовать, что-ли?), который будет "слушать" и выводить данные.

Про софтовую реализацию SPI уже тоже думал... но тоже весь в сомнениях, что заработают одновременно все три составляющих модуля (LAN, SD и этот Wireless), а это как раз и есть основная цель... 

гугл, кстати, ну никак помогать в этом вопросе не хочет. Вываливаются ссылки только на страницы, где эту плату можно купить... но нигде - как с ней полноценно работать. :(

leshak
Offline
Зарегистрирован: 29.09.2011

 >(еще одну дуину задействовать, что-ли

Ну а почему бы и нет? Тем более что она уже есть (если бы небыло, можно было-бы ковертер купить или соорудить дешовый колхоз и старого кабеля для мобилки). Если у вас на дуине есть несколько serial портов, можно написать скетч который из одного принимает, в другой отправляет. И наоборот.

Либо вообще тупо. Залить скетч с пустыми loop() и setup(), и выводы D0 D1 одной платы - соеденить с аналогичными выводами другой. Тогду дуина будет работать просто как USB конвертер. То есть вы, фактически камень не используете, а только встроенный FTDI чип.

>но тоже весь в сомнениях, что заработают одновременно все три составляющих модуля (LAN, SD и этот Wireless)

А похоже что выбора-то нет. Все равно они все на разные пины разведены. Правда SD и LAN похоже подведен на хардварный SPI, так что с ним стандартные либы должны заработать. Возможно только с SS пином повозится прийдется.

ustas
Offline
Зарегистрирован: 12.03.2012

 Сегодня попробую дуину с пустыми loop() и setup() - должно существенно облегчить жизнь при отладке.

По поводу LAN и SD на этой плате - все просто. Они разведены на нормальный хардварный SPI, при этом даже все примеры из штатных библиотек работают без "плясок с бубном". Разводка стандартная оказалась.. а вот беспроводной модуль развели "как получилось", похоже :(

Придется биться с софтовой реализацией SPI... 

leshak
Offline
Зарегистрирован: 29.09.2011

leshak пишет:

Правда SD и LAN похоже подведен на хардварный SPI, так что с ним стандартные либы должны заработать.

ustas пишет:

 По поводу LAN и SD на этой плате - все просто. Они разведены на нормальный хардварный SPI, при этом даже все примеры из штатных библиотек работают без "плясок с бубном". Разводка стандартная оказалась.

:)

не думаю что там "какие-то дебилы" разводили. Видимо есть на то причина (что-то типа "нужно одновременно принимать данные от Ethernet и радио). Но вот дать либы и примеры - конечно могли бы. Все-таки ардуина и подобные шилды предназначены для людей котое хотят "включить и заработало". А не вчитыватся в даташиты и разбиратся с протоколами. Им тогда проще отдельными модулями или вообще рассыпухой купить (и дешевле выйдет).

ustas
Offline
Зарегистрирован: 12.03.2012

 Вот-вот.. о том и речь :) 

Причем, пример использования есть. Но там только одновременно используется Ethernet и SD. А вот остальная функциональность - осталась "за кадром" :(

Опыт с "пустой" дуиной в качестве USB-конвертора полностью удался. Очень просто получилось. 

Правда, сначала почему-то не хотел заливаться скетч.. оказалось, что после прошивки платы через ISP слетел загрузчик (!!!). Вернул его на место через тот же ISP и все нормально заработало.

Попробую поковырять примеры по ссылка выше. Надеюсь, заработает :)

ustas
Offline
Зарегистрирован: 12.03.2012

Еще отличная идея тут родилась (разглядвал свой ящик с "моими прелестями").

Отыскался там OLED-дисплей, работающий по I2C - оказалось, что его предельно просто подключить (4 провода: два на питание и задействовать А4 и А5 - а это все вообще разведено на плате под разъем - так вообще идеально получилось!) - его удобно оказалось использовать в качестве "монитора" для вывода отладочных сообщений (а потом можно и для чего-то более полезного задействовать). 

leshak
Offline
Зарегистрирован: 29.09.2011

 Дисплей это хорошо. Применение ему найти всегда можно. Но IMHO он хорош для вывода инфы вида  "что происходит" когда устройство уже в эксплуатации. Что-бы понимать "что происходит" и когда это можно "поправить" кнопками на самом устройстве. 

При разработке же, Serial, IMHO намного удобней:

  1. Объем выводимой информации.
  2. Нет лишних "деталей проводов" (когда схема глючит - чем меньше всяких "элементов" тем лучше).
  3. Не нужно подключать либы (память)
  4. Есть возможность записать лог (особенно когда какие-то быстрые события или важна их последовательность. потом можно спокойно посмотреть что происходило).
  5. Двунаправленость. Можно командами "эмулировать" какие-то датчики, события и т.п.

Вообщем скорее он более удобен для "индикации режимов работы" чем для "монитора отладочных сообщений".

CooRT
Offline
Зарегистрирован: 30.06.2012

Всем доброго времени суток =)
Поделюсь тем что на накопал на ITEADUINO IBOARD и nRF24L01. Я так же как автор данной темы поначалу ничего не мог найти на выше упомянутое железо. Но путем упорного гугления я все же что-то умудрился найти =)

Для начала я хотел разобраться с nRF24L01 понять что это такое и с чем его едят, по началу пробовал разные прошивки для Arduino, но прошивки либо не компилировались(из-за кривизны рук =) ) или выдавали на "Serial" какой-то мусор =( Потом нашел прошивку kusarak.livejournal.com/134100.html, она завелась с первого раза =)

Далее стал думать как заточить эту прошивку под ITEADUINO IBOARD. Пытался запустить радио модуль на других портах не на MOSI, MISO, но все было безуспешно. Подскажите это вообще можно реализовать ?

Потом принялся гуглить. наткнулся на данную тему понял что я не одинок в своих поисках =) Потом каким то случайным образом зашел на сайт ha.ivanfm.com/hardware/iboard и обалдел =) понял что "вот она, вот она прошивка которая мне нужна. ПРОООООООШШИИИИВКААА" =)

Надеюсь написанный мной пост комунть поможет =) прошу не судить строго и если где ошибся поправить =) По мере продвижения своих экспериментов буду еще выкладывать инфу и полезные ссылки =) Пока что список достижений не велик, поднял WebServer и сделал что-то подобное но только веб-страница грузится с флешки, если кому надо могу поделиться. А так же буду очень признателен если вы поделитесь своими наработками =)
 

ustas
Offline
Зарегистрирован: 12.03.2012

 Вот за это СПАСИБО!!! 

(ушел изучать библиотеки) 

P.S. Про веб-сервер со страницами с флешки - КРАЙНЕ интересно, поделитесь :)

P.P.S. как только доведу проект до чего-то осознанного (и что не стыдно показать) - обязательно выложу результат.

CooRT
Offline
Зарегистрирован: 30.06.2012

ustas пишет:

(ушел изучать библиотеки) 

буду признателел если вы будете добавлять коменты в библиотеку =)

воть простенький вебсервр который читает файл с флешки и выводит его в качестве веб-страници.

#include <SPI.h>
#include <Ethernet.h>
#include <SD.h>
Sd2Card card;
SdVolume volume;
SdFile root;
const int chipSelect = 4;  

byte mac[] = { 
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,1, 177);

EthernetServer server(80);

void setup() {
  Serial.begin(9600);
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());
  if (!SD.begin(chipSelect)) {
          Serial.println("Card failed, or not present");
          return;
    }else{
          Serial.println("card initialized.");
  }
}


void loop() {
  EthernetClient client = server.available();
  if (client) {
    Serial.println("new client");
      
          File dataFile = SD.open("TEST1");
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
      //  Serial.write(c);
        if (c == '\n' && currentLineIsBlank) {
          if (dataFile) {
              while (dataFile.available()) {
              // Serial.write(dataFile.read());
               client.write(dataFile.read());
              }
          }
          break;
        }
        if (c == '\n') {
          // you're starting a new line
          currentLineIsBlank = true;
        } 
        else if (c != '\r') {
          // you've gotten a character on the current line
          currentLineIsBlank = false;
        }
      }
    }
    // give the web browser time to receive the data
    delay(1);
    // close the connection:
    client.stop();
    Serial.println("client disonnected");
    
  }
}

Читает файл "TEST1" с флешки и выводит его.


<!DOCTYPE html PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html>
   <head>
      <title>
         A Small Hello 
      </title>
   </head>
<body>
   <H1>Hi</H1>
   <P>"hello world"</P> 
</bode>
</html>
ustas
Offline
Зарегистрирован: 12.03.2012

 а не пробовали в эту страничку добавить какую-нибудь картинку (gif, jpg) и чтобы она тут же на карте лежала? Нормально отдает?

CooRT
Offline
Зарегистрирован: 30.06.2012

  Пробовал, ради эксперимента добавлял ссылку на картинку (.png) 27КБ но она не отобразилась. Но картинка не отображалась =( По всей видимости надо ее в коде отдавать :

File dataFile = SD.open("img.png");

 ***

   if (dataFile) {
       while (dataFile.available()) {
       client.write(dataFile.read());
   }

но опять же это всего лишь идея, надо будет попробовать ее реализовать =) ток картинку надо будет взять поменьше.

Я вообще хотел с начала разобраться с радио модулями, а потом с визуализацией, т.к. на мой взгляд с радио будет больше мороки.

leshak
Offline
Зарегистрирован: 29.09.2011

 Даже если картинка и отобразится, то это будет "вопреки" стандартам. Просто счас браузеры стараются "глотать ошибки и показать хоть что-то". Так что если оно отобразится в одном браузере, не факт что вы что-то увидите в другом :)

Что-бы "было правильно" общатся с клиентом нужно по протоколу http. Для этого либо почитать описание протокола, либо поставить какой-нибудь прокси для дебагинга (я, например, пользую Fiddler) посмотреть, на примере любого сайта, что шлет браузер что-бы запросить картинку, и как она посылается в ответ, с какими заголовками и т.п. И постаратся "сделать так же".

Как минимум, на мой глаз нужно заголовоки

HTTP/1.1 200 OK - ну что-бы браузер знал что все хорошо и ответ таки будет

Content-Type: image/png - что-бы он имел представление какой смысл имеют бинарные данный которые будут в теле.

Content-Length: XXXX - размер сколько данных будет посланно. не уверен в 100% обязательности, но втыкнул-бы.

---------------

Когда заработает так - дальше игратся со всякими Last-Modified,Expires, кешированием и проч. (если картинка не менялась, зачем ее каждый раз читать-отправлять на каждом рефреше странице. И ардуину напрягать, да и с траница будет медленее грузится. Тем более с такого быстрого "сервера"0.

 

ustas
Offline
Зарегистрирован: 12.03.2012

ОСТОРОЖНО!

Всем, кто будет работать с этой платой!

Вчера малость потестировал перефирию к этому модулю. Подключал через I2C OLED-дисплей и платку RTC (DS1307). 

Прошивал через ISP. При этом сразу после прошивки все нормально работало (банально выводил на дисплей дату и текущее время). 

А вот когда отключил разъем ISP и подключил блок питания - началась свистопляска: на дисплее данные в положенных местах, но данные - произвольные... Подключил опять ISP - и опять все "пучком". Разбираться дальше не стал - пошел спать.

Сегодня мысль "клюнула", что проблемы с модулем RTC. Стал читать спецификации и обнаружил, что на этой плате отстутствует 5В (вся плата работает на 3.3В).

Напряжения питания платы хватает для работы дисплея (нормальный диапазон питания для него как раз 3,3...5В), а вот для часиков - уже мало (они от 5В работают). 

А теперь непосредственно предупреждение - если прошиваете эту плату через ISP - ОБЯЗАТЕЛЬНО отключайте nRF24L01+

P.S. вот сегодня проверю, спалил ли я свой беспроводной модуль... 

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

дабы не плодить тем спрошу здесь

предупреждаю сразу гуглил и толком не нашел ответа

вопрос в следующем. как вы запустили пример для этой платы? у меня выплевывает кучу ошибок

вот собственно сам пример

#include <SPI.h>

/*
 * This sketch will list all files in the root directory and 
 * then do a recursive list of all directories on the SD card.
 *
 */

#include <SdFat.h>
#include <SdFatUtil.h>
#include <Ethernet.h>

/************ ETHERNET STUFF ************/
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192, 168, 0, 177 };
Server server(80);

/************ SDCARD STUFF ************/
Sd2Card card;
SdVolume volume;
SdFile root;

// store error strings in flash to save RAM
#define error(s) error_P(PSTR(s))

void error_P(const char* str) {
  PgmPrint("error: ");
  SerialPrintln_P(str);
  if (card.errorCode()) {
    PgmPrint("SD error: ");
    Serial.print(card.errorCode(), HEX);
    Serial.print(',');
    Serial.println(card.errorData(), HEX);
  }
  while(1);
}

void setup() {
  Serial.begin(9600);
 
  PgmPrint("Free RAM: ");
  Serial.println(FreeRam());  
  
  // initialize the SD card at SPI_HALF_SPEED to avoid bus errors with
  // breadboards.  use SPI_FULL_SPEED for better performance.
  pinMode(10, OUTPUT);                       // set the SS pin as an output (necessary!)
  digitalWrite(10, HIGH);                    // but turn off the W5100 chip!

  if (!card.init(SPI_HALF_SPEED, 4)) error("card.init failed!");
  
  // initialize a FAT volume
  if (!volume.init(&card)) error("vol.init failed!");

  PgmPrint("Volume is FAT");
  Serial.println(volume.fatType(),DEC);
  Serial.println();
  
  if (!root.openRoot(&volume)) error("openRoot failed");

  // list file in root with date and size
  PgmPrintln("Files found in root:");
  root.ls(LS_DATE | LS_SIZE);
  Serial.println();
  
  // Recursive list of all directories
  PgmPrintln("Files found in all dirs:");
  root.ls(LS_R);
  
  Serial.println();
  PgmPrintln("Done");
  
  // Debugging complete, we start the server!
  Ethernet.begin(mac, ip);
  server.begin();
}

void loop()
{
  Client client = server.available();
  if (client) {
    // an http request ends with a blank line
    boolean current_line_is_blank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        // if we've gotten to the end of the line (received a newline
        // character) and the line is blank, the http request has ended,
        // so we can send a reply
        if (c == '\n' && current_line_is_blank) {
          // send a standard http response header
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println();
          
          // print all the files, use a helper to keep it clean
          //ListFiles(client, 0);
          client.println("<h2>Files:</h2>");
          ListFiles(client, 0);
          
          break;
        }
        if (c == '\n') {
          // we're starting a new line
          current_line_is_blank = true;
        } else if (c != '\r') {
          // we've gotten a character on the current line
          current_line_is_blank = false;
        }
      }
    }
    // give the web browser time to receive the data
    delay(1);
    client.stop();
  }
}


void ListFiles(Client client, uint8_t flags) {
  // This code is just copied from SdFile.cpp in the SDFat library
  // and tweaked to print to the client output in html!
  dir_t p;
  
  root.rewind();
  while (root.readDir(p) > 0) {
    // done if past last used entry
    if (p.name[0] == DIR_NAME_FREE) break;

    // skip deleted entry and entries for . and  ..
    if (p.name[0] == DIR_NAME_DELETED || p.name[0] == '.') continue;

    // only list subdirectories and files
    if (!DIR_IS_FILE_OR_SUBDIR(&p)) continue;
   

    // print file name with possible blank fill
    //root.printDirName(*p, flags & (LS_DATE | LS_SIZE) ? 14 : 0);


    for (uint8_t i = 0; i < 11; i++) {
      if (p.name[i] == ' ') continue;
      if (i == 8) {
        client.print('.');
      }
      client.print(p.name[i]);
    }
    if (DIR_IS_SUBDIR(&p)) {
      client.print('/');
    }

    // print modify date/time if requested
    if (flags & LS_DATE) {
       root.printFatDate(p.lastWriteDate);
       client.print(' ');
       root.printFatTime(p.lastWriteTime);
    }
    // print size if requested
    if (!DIR_IS_SUBDIR(&p) && (flags & LS_SIZE)) {
      client.print(' ');
      client.print(p.fileSize);
    }
    client.println("<br>");
  }
}

и ошибки

In file included from C:\YandexDisk\arduino-1.0.5-r2\libraries\SdFat/SdFat.h:26,
                 from sketch_may21a.ino:9:
C:\YandexDisk\arduino-1.0.5-r2\libraries\SdFat/SdFile.h:36: error: conflicting return type specified for 'virtual void SdFile::write(uint8_t)'
C:\YandexDisk\arduino-1.0.5-r2\hardware\arduino\cores\arduino/Print.h:48: error:   overriding 'virtual size_t Print::write(uint8_t)'
sketch_may21a:18: error: cannot declare parameter 'client' to be of abstract type 'Client'
C:\YandexDisk\arduino-1.0.5-r2\hardware\arduino\cores\arduino/Client.h:7: note:   because the following virtual functions are pure within 'Client':
C:\YandexDisk\arduino-1.0.5-r2\hardware\arduino\cores\arduino/Client.h:12: note: 	virtual size_t Client::write(uint8_t)
C:\YandexDisk\arduino-1.0.5-r2\hardware\arduino\cores\arduino/Client.h:13: note: 	virtual size_t Client::write(const uint8_t*, size_t)
C:\YandexDisk\arduino-1.0.5-r2\hardware\arduino\cores\arduino/Client.h:14: note: 	virtual int Client::available()
C:\YandexDisk\arduino-1.0.5-r2\hardware\arduino\cores\arduino/Client.h:15: note: 	virtual int Client::read()
C:\YandexDisk\arduino-1.0.5-r2\hardware\arduino\cores\arduino/Client.h:17: note: 	virtual int Client::peek()
C:\YandexDisk\arduino-1.0.5-r2\hardware\arduino\cores\arduino/Client.h:18: note: 	virtual void Client::flush()
C:\YandexDisk\arduino-1.0.5-r2\hardware\arduino\cores\arduino/Client.h:10: note: 	virtual int Client::connect(IPAddress, uint16_t)
C:\YandexDisk\arduino-1.0.5-r2\hardware\arduino\cores\arduino/Client.h:11: note: 	virtual int Client::connect(const char*, uint16_t)
C:\YandexDisk\arduino-1.0.5-r2\hardware\arduino\cores\arduino/Client.h:16: note: 	virtual int Client::read(uint8_t*, size_t)
C:\YandexDisk\arduino-1.0.5-r2\hardware\arduino\cores\arduino/Client.h:19: note: 	virtual void Client::stop()
C:\YandexDisk\arduino-1.0.5-r2\hardware\arduino\cores\arduino/Client.h:20: note: 	virtual uint8_t Client::connected()
C:\YandexDisk\arduino-1.0.5-r2\hardware\arduino\cores\arduino/Client.h:21: note: 	virtual Client::operator bool()
sketch_may21a:16: error: no matching function for call to 'Server::Server(int)'

Начиная с версии Arduino 1.0, класс Server библиотеки Ethernet был переименован в EthernetServer.

C:\YandexDisk\arduino-1.0.5-r2\hardware\arduino\cores\arduino/Server.h:4: note: candidates are: Server::Server()
C:\YandexDisk\arduino-1.0.5-r2\hardware\arduino\cores\arduino/Server.h:4: note:                 Server::Server(const Server&)
sketch_may21a:16: error: cannot declare variable 'server' to be of abstract type 'Server'
C:\YandexDisk\arduino-1.0.5-r2\hardware\arduino\cores\arduino/Server.h:4: note:   because the following virtual functions are pure within 'Server':
C:\YandexDisk\arduino-1.0.5-r2\hardware\arduino\cores\arduino/Print.h:48: note: 	virtual size_t Print::write(uint8_t)
C:\YandexDisk\arduino-1.0.5-r2\hardware\arduino\cores\arduino/Server.h:6: note: 	virtual void Server::begin()
sketch_may21a.ino: In function 'void loop()':
sketch_may21a:79: error: 'class Server' has no member named 'available'
sketch_may21a:79: error: cannot declare variable 'client' to be of abstract type 'Client'
C:\YandexDisk\arduino-1.0.5-r2\hardware\arduino\cores\arduino/Client.h:7: note:   since type 'Client' has pure virtual functions
sketch_may21a:98: error: cannot allocate an object of abstract type 'Client'
C:\YandexDisk\arduino-1.0.5-r2\hardware\arduino\cores\arduino/Client.h:7: note:   since type 'Client' has pure virtual functions
sketch_may21a.ino: At global scope:
sketch_may21a:118: error: cannot declare parameter 'client' to be of abstract type 'Client'
C:\YandexDisk\arduino-1.0.5-r2\hardware\arduino\cores\arduino/Client.h:7: note:   since type 'Client' has pure virtual functions

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

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

от большинства ошибок удалось избавится, немного осталось

#include <SPI.h>
#include <SdFat.h>
#include <SdFatUtil.h>
#include <Ethernet.h>

/************ ETHERNET STUFF ************/
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192, 168, 0, 177 };
EthernetServer EthernetServer(80);

/************ SDCARD STUFF ************/
Sd2Card card;
SdVolume volume;
SdFile root;

// store error strings in flash to save RAM
#define error(s) error_P(PSTR(s))

void error_P(const char* str) {
  PgmPrint("error: ");
  SerialPrintln_P(str);
  if (card.errorCode()) {
    PgmPrint("SD error: ");
    Serial.print(card.errorCode(), HEX);
    Serial.print(',');
    Serial.println(card.errorData(), HEX);
  }
  while(1);
}

void setup() {
  Serial.begin(9600);
 
  PgmPrint("Free RAM: ");
  Serial.println(FreeRam());  
  
  // initialize the SD card at SPI_HALF_SPEED to avoid bus errors with
  // breadboards.  use SPI_FULL_SPEED for better performance.
  pinMode(10, OUTPUT);                       // set the SS pin as an output (necessary!)
  digitalWrite(10, HIGH);                    // but turn off the W5100 chip!

  if (!card.init(SPI_HALF_SPEED, 4)) error("card.init failed!");
  
  // initialize a FAT volume
  if (!volume.init(&card)) error("vol.init failed!");

  PgmPrint("Volume is FAT");
  Serial.println(volume.fatType(),DEC);
  Serial.println();
  
  if (!root.openRoot(&volume)) error("openRoot failed");

  // list file in root with date and size
  PgmPrintln("Files found in root:");
  root.ls(LS_DATE | LS_SIZE);
  Serial.println();
  
  // Recursive list of all directories
  PgmPrintln("Files found in all dirs:");
  root.ls(LS_R);
  
  Serial.println();
  PgmPrintln("Done");
  
  // Debugging complete, we start the EthernetServer!
  Ethernet.begin(mac, ip);
  EthernetServer.begin();
}

void loop()
{
  EthernetClient EthernetClient = EthernetServer.available();
  if (EthernetClient) {
    // an http request ends with a blank line
    boolean current_line_is_blank = true;
    while (EthernetClient.connected()) {
      if (EthernetClient.available()) {
        char c = EthernetClient.read();
        // if we've gotten to the end of the line (received a newline
        // character) and the line is blank, the http request has ended,
        // so we can send a reply
        if (c == '\n' && current_line_is_blank) {
          // send a standard http response header
          EthernetClient.println("HTTP/1.1 200 OK");
          EthernetClient.println("Content-Type: text/html");
          EthernetClient.println();
          
          // print all the files, use a helper to keep it clean
          //ListFiles(EthernetClient, 0);
          EthernetClient.println("<h2>Files:</h2>");
          ListFiles(EthernetClient, 0);
          
          break;
        }
        if (c == '\n') {
          // we're starting a new line
          current_line_is_blank = true;
        } else if (c != '\r') {
          // we've gotten a character on the current line
          current_line_is_blank = false;
        }
      }
    }
    // give the web browser time to receive the data
    delay(1);
    EthernetClient.stop();
  }
}


void ListFiles(EthernetClient EthernetClient, uint8_t flags) {
  // This code is just copied from SdFile.cpp in the SDFat library
  // and tweaked to print to the EthernetClient output in html!
  dir_t p;
  
  root.rewind();
  while (root.readDir(p) > 0) {
    // done if past last used entry
    if (p.name[0] == DIR_NAME_FREE) break;

    // skip deleted entry and entries for . and  ..
    if (p.name[0] == DIR_NAME_DELETED || p.name[0] == '.') continue;

    // only list subdirectories and files
    if (!DIR_IS_FILE_OR_SUBDIR(&p)) continue;
   

    // print file name with possible blank fill
    //root.printDirName(*p, flags & (LS_DATE | LS_SIZE) ? 14 : 0);


    for (uint8_t i = 0; i < 11; i++) {
      if (p.name[i] == ' ') continue;
      if (i == 8) {
        EthernetClient.print('.');
      }
      EthernetClient.print(p.name[i]);
    }
    if (DIR_IS_SUBDIR(&p)) {
      EthernetClient.print('/');
    }

    // print modify date/time if requested
    if (flags & LS_DATE) {
       root.printFatDate(p.lastWriteDate);
       EthernetClient.print(' ');
       root.printFatTime(p.lastWriteTime);
    }
    // print size if requested
    if (!DIR_IS_SUBDIR(&p) && (flags & LS_SIZE)) {
      EthernetClient.print(' ');
      EthernetClient.print(p.fileSize);
    }
    EthernetClient.println("<br>");
  }
}

ошибки

In file included from C:\YandexDisk\arduino-1.0.5-r2\libraries\SdFat/SdFat.h:26,
                 from sd_5100.ino:2:
C:\YandexDisk\arduino-1.0.5-r2\libraries\SdFat/SdFile.h:36: error: conflicting return type specified for 'virtual void SdFile::write(uint8_t)'
C:\YandexDisk\arduino-1.0.5-r2\hardware\arduino\cores\arduino/Print.h:48: error:   overriding 'virtual size_t Print::write(uint8_t)'

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

эту ошибку не могу исправить. не особо понимаю что делать

In file included from C:\YandexDisk\arduino-1.0.5-r2\libraries\SdFat/SdFat.h:26,
                 from sd_5100.ino:2:
C:\YandexDisk\arduino-1.0.5-r2\libraries\SdFat/SdFile.h:36: error: conflicting return type specified for 'virtual void SdFile::write(uint8_t)'
C:\YandexDisk\arduino-1.0.5-r2\hardware\arduino\cores\arduino/Print.h:48: error:   overriding 'virtual size_t Print::write(uint8_t)'

вот что в SdFile.h:36

void write(uint8_t b);

в Print.h:48

virtual size_t write(uint8_t) = 0;

что нужно исправить?

почему конфликтует? ведь классы то разные. привязки к Print.h не нашел

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Скорей всего Print является базовым классом для SdFat, потому методы/функции, которые называются одинаково "зависимы", во всяком случае при одинаковых параметрах у них должны быть одинаковый тип выходного параметра. Здесь же явно видно void и size_t. Не вдавался в подробности, но как вариант:
1. Исправить описание в SdFat.h, типа: virtual size_t write( uint8_t b);
2. Исправить эту функцию в SdFat.cpp, добавив возврат в конце return .... Что возвращать нужно посмотреть в Print::write и по ситуации.

После этого ошибок компиляции быть не должно.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

да Print оказывается базовый класс, в комментариях в библиотеке было написано. исправить не получилось. ошибок еще больше вылезло. ну да фиг с ней, вырезал все про sd карточку, хоть как то завести

надеюсь ustas поделится кодом, хотя в этой теме он писал еще в 2012 году. врядли

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Если дашь ссылку на исходную либу, могу попробовать исправить (до состояния компиляции, железа нет, потому не смогу проверить, но под Uno скомпилирую).

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

http://yadi.sk/d/CXjuENmaEEwun

файлы sd_5100 и SdFat

попробуйте может получится

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Выкладываю только измененные файлы.

https://www.dropbox.com/s/a5cto3xk0echrn1/SdFat_fix.zip

Нужно заменить эти три файла в библиотеке SdFat, после этого скетч sd_5100.ino компилируется без ошибок.

Вообще я уже встречал такую ошибку, вполне возможно раньше метод Print::write был virtual void Print::write( uint8_t b);, другого объяснения  не могу придумать, иначе бы у авторов библиотек тоже бы не компилировалось. Ладно, не парьте мозг, надеюсь всё заработает.

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

спасибо большое. скоро проверю

отцепив все что было в коде по обращению к sd вебсервер заработал, что уже радует

+ компилируется))

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

проверил. работает))

выкладываю, кому нибудь понадобится

http://yadi.sk/d/CXjuENmaEEwun

Файл

IBoard1.1_SdFat

Пример

Iboard_1_1_test