Не работает пример c SD картой

cfytr
Offline
Зарегистрирован: 01.05.2011

Сделал все как написано здесь habrahabr.ru/blogs/arduino/115176/ на плате freeduino 2009. После прошивки начинает мигать диод на 13 ноге где-то раз в секунду, а в терминале с такой же периодичностью пишет "Initializing SD card..." и все. Никакие файлы на карте не появляются. Помогите решить проблему.

 

Adessit
Adessit аватар
Offline
Зарегистрирован: 12.04.2011

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

cfytr
Offline
Зарегистрирован: 01.05.2011

все проверил несколько раз, косяков нет, питаюсь от usb. может поставить конденсатор между питанием и землей?

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

Adessit
Adessit аватар
Offline
Зарегистрирован: 12.04.2011

у людей работает при аналагичных настройках. Значит нужно отдохуть отвлечься и позже еще раз всё перепроверить. Там питание должно быть 3.3В берется с самого ардуино. А пины для SPI там правильно указаны 

cfytr
Offline
Зарегистрирован: 01.05.2011

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

Nikelbak
Nikelbak аватар
Offline
Зарегистрирован: 22.03.2011

а можно глянуть на ваше творение в реале (фото).  Да и еще, незабудте отворматить карту в fat, у мну просто была проблема изза этого. не писался файл. 

cfytr
Offline
Зарегистрирован: 01.05.2011

в fat форматировал и другую карту пробовал и fat32 пробовал

s56.radikal.ru/i153/1105/31/42795d0956b7.jpg

s40.radikal.ru/i089/1105/e6/3191dab49250.jpg

Nikelbak
Nikelbak аватар
Offline
Зарегистрирован: 22.03.2011

плохо видно но вот смотрю что у вас с 13 пина попадает на резистор а потом через перемычку на еще один, если это так то тогда не правильно. Должно с ардуины от 13 пина идти до резистора потом после резистора еще один а между ними вывод до карты, а у вас кажется как будто наоборот. ...

cfytr
Offline
Зарегистрирован: 01.05.2011

 нет, все как на схеме, два дальних резистора, слева 13 нога, посередине 5 нога карты, справа земля. А бело-синяя перемычка, это земля на 6 ногу карты

cfytr
Offline
Зарегистрирован: 01.05.2011

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

Nikelbak
Nikelbak аватар
Offline
Зарегистрирован: 22.03.2011

хмм странно. 

Adessit
Adessit аватар
Offline
Зарегистрирован: 12.04.2011

В среду-четверг соберу такую же схему для проверки 

cfytr
Offline
Зарегистрирован: 01.05.2011

более менее заработало. если не использовать последовательный порт после инициализации карты, то программа работает без сбоев. Если же где-нибудь после открытия файла или проверки на его существование воткнуть Serial.println(""); тогда то и начинаются лаги. Похоже не судьба мне последовательным портом пользоваться.

 

Nikelbak
Nikelbak аватар
Offline
Зарегистрирован: 22.03.2011

 Интересно, но ведь должно быть решение все равно.

batyshev
Offline
Зарегистрирован: 10.06.2011

Подскажите пожалуйсто где скачать библиотеку SD.H пришлите ссылку пожалуйста. Очень надо записывать на карту в текстовом формате.

cfytr
Offline
Зарегистрирован: 01.05.2011

 библиотека идет в комплекте с Arduino 0022. arduino.cc/en/Reference/SD

cfytr
Offline
Зарегистрирован: 01.05.2011

проблему решил. лаги ардуины связаны с переполнением RAM. на моей atmega 168 всего 1КБ. библиотека sd занимает очень много места+ буфер serial + все строки. когда память переполняется ардуина перезагружается. решение - экономить память любыми способами. robocraft.ru/blog/arduino/88.html robocraft.ru/blog/arduino/531.html

Mr.Shmel
Mr.Shmel аватар
Offline
Зарегистрирован: 18.08.2011

У меня не работает тот-же пример! Подскажите, из-за чего он может не работать?! при открытии порта пишет "инициализация" и ВСЁ...

не перезагружается, а просто стоит в таком состоянии..

Карточка micro SD 2GB через SD адаптер, отформатирована в Fat32....

фотографии будут чуть позже, если нужно, конечно

Плата Freeduino 2009 (ATmega128)

accente
Offline
Зарегистрирован: 18.09.2011

 Ребят, малость не по теме, но всё же. Если кто покупал такую вот штуку http://viewitem.eim.ebay.ru/Arduino-WAV-Sound-Broadcast-Kits/270675858361/item Arduino WAV Sound Broadcast Kits - там есть несколько проблемм. 1)ардуино не определяется как arduino uno. Вероятно надо прошивать, но пока было некогда, посему перекинул всё на обычную UNO. 2)стандартные библиотеки sd неподходят. в настройках надо менять пины, и дополнительно со странички разработчика надо качать и подключать библиотеку управления звуковым контроллером.  Если надо - напишите, поищу. Особо пока не разбирался, но простые примеры работать заставил :-)

LEVV2006
LEVV2006 аватар
Offline
Зарегистрирован: 15.04.2011

Есть DFRobot Ethernet Shield с картридером но мне тоже не удаётся сделать пример который описан выше. Может кто справился с картридером?

Sergeyevd
Sergeyevd аватар
Offline
Зарегистрирован: 25.03.2014
#include <SD.h>
File myFile;
int text;
void setup()
{
Serial.begin(9600);
Serial.print("Initializing SD card...");
pinMode(4, OUTPUT);
if (!SD.begin(10)) {
Serial.println("initialization failed!");
return;
}
Serial.println("initialization done.");
myFile = SD.open("index.htm");
if (myFile) {
Serial.println("index.htm");
while (myFile.available()) {
//Serial.write(myFile.read());
text = myFile.read();
Serial.print(text);
}
myFile.close();
} else {
Serial.println("error opening index.htm");
}
}

void loop()
{

}

Друзья, подскажите как сделать чтобы в переменной text был текст index.htm в его "первоначальном" виде,а не:

Initializing SD card...initialization done.
index.htm
603368796784898069321041161091086213106010411610910862131032323.......................и.т.д.
DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

строка 19, заменить на:

text = (char) myFile.read();

и будет щастье.

Sergeyevd
Sergeyevd аватар
Offline
Зарегистрирован: 25.03.2014
Initializing SD card...initialization done.
index.htm
60336879678489806932104116109108621310601041161091086213103232323260...
Аналогично
DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Sergeyevd пишет:

Initializing SD card...initialization done.
index.htm
60336879678489806932104116109108621310601041161091086213103232323260...
Аналогично

Да, забыл: строка 03: поменять int text; на

char text;

Sergeyevd
Sergeyevd аватар
Offline
Зарегистрирован: 25.03.2014

char text;

Работаетю

Спасибо.

Sergeyevd
Sergeyevd аватар
Offline
Зарегистрирован: 25.03.2014
void loop()
{
delay(5000);
Serial.print(text);
}

Как я понял чтение происходит посимвольно.

И в моём варианте при использовании в void loop той же переменной каждые 5 сек мне приходит >, т.е. последний символ в файле?

 

 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Sergeyevd пишет:


Как я понял чтение происходит посимвольно.

И в моём варианте при использовании в void loop той же переменной каждые 5 сек мне приходит >, т.е. последний символ в файле?

Ничего не понял из вашего объяснения, если честно. Читать можно и посимвольно, и блоками - как вам будет угодно. Посмотрите документацию на класс Stream - там описаны все методы, которые вы можете использовать. Там есть и посимвольное чтение, и блочное. А поскольку Serial является наследником класса Stream - эти методы автоматически доступны и в Serial.

Sergeyevd
Sergeyevd аватар
Offline
Зарегистрирован: 25.03.2014

Ничего не понимаю с буфером.

Мне нужно загнать весь текст из index.htm в переменную, которую могу использовать в любом месте.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Sergeyevd пишет:

Ничего не понимаю с буфером.

Мне нужно загнать весь текст из index.htm в переменную, которую могу использовать в любом месте.

Ну так в чём проблема?

String textHere = "";

char ch;

while(1)
{
 ch = (char) myFile.read();
 if(ch < 0)
  break;
 textHere  += ch;
}

Это тупо в лоб, что называется.

Sergeyevd
Sergeyevd аватар
Offline
Зарегистрирован: 25.03.2014
#include <SD.h>
File myFile;
String text;
char konec = '/n';
void setup()
{

Serial.begin(250000);
Serial.print("Initializing SD card...");
pinMode(4, OUTPUT);
if (!SD.begin(10)) {
Serial.println("initialization failed!");
return;
}
Serial.println("initialization done.");
myFile = SD.open("index.htm");
if (myFile) {
Serial.println("index.htm");
while (myFile.available()) {
//text = (char)myFile.read();
text = myFile.readStringUntil(konec);
Serial.print(text);
}


myFile.close();
} else {
Serial.println("error opening index.htm");
}
}

void loop()
{

//Serial.print(text);
delay(3000);
Serial.print(text);
}

 

Первый раз текст печатается как надо.

В void loop

</html>vas>
    </body>
</html>

 

 

 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

В строке 4 ошибка, должно быть '\n', а не '/n'

Sergeyevd
Sergeyevd аватар
Offline
Зарегистрирован: 25.03.2014
while(myFile.available())
{
 ch = (char) myFile.read();
 if(ch < 0)
  break;
 textHere  += ch;
}

 

Выдаёт кусок текста

Initializing SD card...initialization done.
index.htm
<!DOCTYPE html>
<html>
    <head>
        <title>Arduino Two Temperatures</title>
        <script>
        var data_val = 0;
        var data_val2 = 0;
<!-- Gauge Code Starts -->
var Gauge=function(b){function l(a,b){for(var c in b)"object"==typeof b[c]&&"[object Array]"!==Object.prototype.toString.call(b[c])&&"renderTo"!=c?("object"!=typeof a[c]&&(a[c]={}),l(a[c],b[c])):a[c]=b[c]}function q(){z.width=b.width;z.height=b.height;A=z.cloneNode(!0);B=A.getContext("2d");C=z.width;D=z.height;t=C/2;u=D/2;f=t<u?t:u;A.i8d=!1;B.translate(t,u);B.save();a.translate(t,u);a.save()}function v(a){var b=new Date;G=setInterval(function(){var c=(new Date-b)/a.duration;1<c&&(c=1);var f=("function"==
typeof a.delta?a.delta:M[a.delta])(c);a.step(f);1==c&&clearInterval(G)},a.delay||10)}function k(){G&&clearInterval(G);var a=I-n,h=n,c=b.animatio
DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

А дальше просто память кончается ;) Я же вам говорил - пример тупо в лоб. Вы же не думали, что оперативки у вас вагон? Вот с этим всем как-то и придётся жить. Думайте.

Sergeyevd
Sergeyevd аватар
Offline
Зарегистрирован: 25.03.2014

Значит не получится открыть файл спомощью #include <EtherCard.h>

 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

С помощью #include <EtherCard.h> - не получится, т.к. вы путаетё тёплое с мягким.

Sergeyevd
Sergeyevd аватар
Offline
Зарегистрирован: 25.03.2014
#include <EtherCard.h>
#include <SD.h>
File myFile;
char text;

static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 };
static byte myip[] = { 192,168,1,100 };
const char website[] PROGMEM = "192.168.1.100";
byte Ethernet::buffer[200];
BufferFiller bfill;

void setup () {
  Serial.begin(9600);
//
pinMode(4, OUTPUT);
if (!SD.begin(4)) {
  Serial.println("initialization failed!");
return;
}
Serial.println("initialization done.");

delay(2000);
ether.begin(sizeof Ethernet::buffer, mymac, 10);
ether.staticSetup(myip);

}

void loop () {

word pos = ether.packetLoop(ether.packetReceive());
if (pos){
// получаем заголовки
 char *data = (char *) Ethernet::buffer + pos;
//Serial.print(data);
// проверяем на наличие в заголовках нужных нам строк
if (strstr(data, "GET /index.htm") || strstr(data, "GET / HTTP/1.1") ) {
  
myFile = SD.open("text.txt");
if (myFile) {
Serial.println("Otkr");
while (myFile.available()) {
//Serial.write(myFile.read());
text = (char)myFile.read();
}

myFile.close();
} else {
Serial.println("NeOtkr");
}

bfill = ether.tcpOffset();
bfill.emit_p(PSTR(
"HTTP/1.0 200 OK\r\n"
"Content-Type: text/html\r\n"
"\r\n"
"<html><head>"
"<meta charset=\"utf-8\">"
"<title>Текст</title>"
"</head><body>"
"Текст файла text.txt</br>"
"<p>$D</p>"
"</body></html>"
),text); 

}
 ether.httpServerReply(bfill.position());
 }
}

Текстовый файл содержит "0123456789"

По адресу 192.168.1.100

Текст файла text.txt

57