USB-хост Arduino и SD-карта
Когда я использую SD-карту на Mega или Arduino Uno, все работает. Всё хорошо. Однако когда я использую его в сочетании с хостом USB Shield, он не работает. Я знаю, что хост USB Shield работает, потому что работает ЖК-дисплей и считыватель штрих-кода. Это не SD-карта, потому что SD-карта работает только с платами. Проблемы с подключением возникают только тогда, когда я добавляю экран.
Я получаю сообщение об ошибке: Не удалось инициализировать последовательный монитор. Я пробовал писать высоко, но не получилось.
Есть идеи?
///////////////////////////////////////////// //////////////////////
// Простой регистратор данных Arduino v1.03 //
// Получите последнюю версию кода здесь: //
// http://educ8s.tv/arduino-data-logger-project
// RTC: контакт scl-scl, контакт sda-sda, vcc-5v, контакт gnd-gnd
// SD: vcc-5v, grnd-grnd, mosi-pin 11, miso-pin 12, sck-13 pin, CS (выбор чипа)-10
// измените на CSV, если хотите открыть в Excel. файл журнала.
/////////////////////////////////////////////////// ///////////////
#include <Wire.h>
#include "ds3231.h"
#include <SD.h>
#include <SPI.h>
#include <stdint.h> // добавляем эту и следующие 2 строки
#define BUFF_MAX 128
#define DS3231_INTCN 0x4
#define DS3231_A1IE 0x1
#define DS3231_A2IE 0x2
int CS_PIN = 4;
File file;
String timeString;
String dateString;
int entryId = 0;
uint8_t time[8];
char recv[BUFF_MAX];
unsigned int recv_size = 0;
unsigned long prev = 0, interval = 1000;
void setup()
{
Serial.begin(9600);
Wire.begin();
initializeSD();
DS3231_init(DS3231_INTCN);
memset(recv, 0, BUFF_MAX);
parse_cmd("T302410401112018",16); //Установить время
}
void loop()
{
String logEntry;
char in;
char buff[BUFF_MAX];
unsigned long now = millis();
// Регистрируем данные время от времени
if ((now - prev > interval) && (Serial.available() <= 0)) {
getTime();
logEntry = createLogEntry();
writeEntryToFile(logEntry);
prev = now;
}
if (Serial.available() > 0) {
in = Serial.read();
if ((in == 10 || in == 13) && (recv_size > 0)) {
parse_cmd(recv, recv_size);
recv_size = 0;
recv[0] = 0;
} else if (in < 48 || in > 122) {
; // игнорировать ~[0-9A-Za-z]
} else if (recv_size > BUFF_MAX - 2) { // удаляем слишком длинные строки
// уронить
recv_size = 0;
recv[0] = 0;
} else if (recv_size < BUFF_MAX - 2) {
recv[recv_size] = in;
recv[recv_size + 1] = 0;
recv_size += 1;
}
}
}
void parse_cmd(char *cmd, int cmdsize)
{
uint8_t i;
uint8_t reg_val;
char buff[BUFF_MAX];
struct ts t;
// TssmmhhWDDMMYYYY или установка времени
if (cmd[0] == 84 && cmdsize == 16) {
//T355720619112011
t.sec = inp2toi(cmd, 1);
t.min = inp2toi(cmd, 3);
t.hour = inp2toi(cmd, 5);
t.wday = inp2toi(cmd, 7);
t.mday = inp2toi(cmd, 8);
t.mon = inp2toi(cmd, 10);
t.year = inp2toi(cmd, 12) * 100 + inp2toi(cmd, 14);
DS3231_set(t);
//Serial.println("ОК");
} else if (cmd[0] == 49 && cmdsize == 1) { // "1" получаем сигнал тревоги 1
DS3231_get_a1(&buff[0], 59);
//Serial.println(бафф);
} else if (cmd[0] == 50 && cmdsize == 1) { // "2" получаем сигнал тревоги 1
DS3231_get_a2(&buff[0], 59);
// Serial.println(бафф);
} else if (cmd[0] == 51 && cmdsize == 1) { // "3" получаем регистр устаревания
//Serial.print("Устаревшая регистрация");
//Serial.println(DS3231_get_aging(), DEC);
} else if (cmd[0] == 65 && cmdsize == 9) { // "A" установил сигнал тревоги 1
DS3231_set_creg(DS3231_INTCN | DS3231_A1IE);
//АССММХЖД
for (i = 0; i < 4; i++) {
time[i] = (cmd[2 * i + 1] - 48) * 10 + cmd[2 * i + 2] - 48; // сс, мм, чч, дд
}
byte flags[5] = { 0, 0, 0, 0, 0 };
DS3231_set_a1(time[0], time[1], time[2], time[3], flags);
DS3231_get_a1(&buff[0], 59);
// Serial.println(бафф);
} else if (cmd[0] == 66 && cmdsize == 7) { // "B" устанавливает сигнал тревоги 2
DS3231_set_creg(DS3231_INTCN | DS3231_A2IE);
//БММХЖД
for (i = 0; i < 4; i++) {
time[i] = (cmd[2 * i + 1] - 48) * 10 + cmd[2 * i + 2] - 48; // мм, чч, дд
}
byte flags[5] = { 0, 0, 0, 0 };
DS3231_set_a2(time[0], time[1], time[2], flags);
DS3231_get_a2(&buff[0], 59);
//Serial.println(бафф);
} else if (cmd[0] == 68 && cmdsize == 1) { // "D" - сброс флагов тревоги регистра состояния
reg_val = DS3231_get_sreg();
reg_val &= B11111100;
DS3231_set_sreg(reg_val);
} else if (cmd[0] == 70 && cmdsize == 1) { // "F" — пользовательская функция
reg_val = DS3231_get_addr(0x5);
// Serial.print("оригинал");
//Serial.print(reg_val,DEC);
//Serial.print("месяц");
//Serial.println(bcdtodec(reg_val & 0x1F),DEC);
} else if (cmd[0] == 71 && cmdsize == 1) { // "G" - установить регистр статуса устаревания
DS3231_set_aging(0);
}
}
void getTime()
{
String minute;
String hour;
struct ts t;
DS3231_get(&t);
if(t.min<10)
{
minute = "0"+String(t.min);
} else
{
minute = String(t.min);
}
timeString = String(t.hour)+":"+minute;
dateString = String(t.mon)+"/"+t.mday;
}
String createLogEntry()
{
String logEntry;
entryId ++;
logEntry = String(entryId)+","+dateString+","+timeString;
return logEntry;
}
void writeEntryToFile(String entry)
{
openFileToWrite("Olirians.csv");
Serial.println(entry);
writeToFile(entry);
closeFile();
}
void initializeSD()
{
pinMode(CS_PIN, OUTPUT);
if (SD.begin())
{
} else
{
return;
}
}
int openFileToWrite(char filename[])
{
file = SD.open(filename, FILE_WRITE);
if (file)
{
return 1;
} else
{
return 0;
}
}
int writeToFile(String text)
{
if (file)
{
file.println(text);
return 1;
} else
{
return 0;
}
}
void closeFile()
{
if (file)
{
file.close();
}
}
@Kayaway, 👍0
Обсуждение2 ответа
И USB-хост-шилд, и SD-карта используют интерфейс SPI. Вы используете их на разных чипах? Шилд хоста использует контакт 10 в качестве CS.
Нет, я ставлю USB-модуль на 10-й контакт., @Kayaway
USB Host Shield использует контакт 10 в качестве CS. Используйте контакт 4 в качестве CS для модуля SD.
Чтобы установить вывод CS в библиотеку SD, установите его как параметр SD.begin:
SD.begin(CS_PIN);
Примечание: ИС преобразования уровня на некоторых дешевых модулях SD нарушают работу шины SPI, и модуль нельзя использовать с другими устройствами SPI.
Вы имеете в виду вставить CS в контакт 4 USB-экрана? Я вставил SD-модуль в контакт 10 и попробовал его в контакте 4 шилда., @Kayaway
на щите нет контакта 4. это пин Уно под экраном, @Juraj
снова проверьте модуль SD соло, используя контакт 4 как CS. установите вывод 4 в эскизе SD.begin(4);
, @Juraj
Это не сработало. я загружу свой код, @Kayaway
используйте контакт 4 в качестве CS. SD.begin(4)
или SD.begin(SD_CS_PIN)
, @Juraj
@Kayaway, это помогло?, @Juraj
Нет. Но контакт 7 работал., @Kayaway
тогда это помогло. вы не использовали PIN-код начала с CS, @Juraj
- Переключение между устройствами SPI, когда одно из них является SD-картой
- Проблемы Funduino USB Host Shield
- Подключение джойстика Logitech к Arduino и прерывание цикла while
- USB-УСТРОЙСТВА С 32U4?
- Проблемы с отправкой сигналов на Arduino-Uno через клавиатуру
- Первая настройка - отказ в доступе к usb-порту - ubuntu 14.04
- Почему я получаю avrdude: stk500v2_ReceiveMessage(): timeout error when uploading to Arduino Mega?
- Может ли Arduino взаимодействовать с USB-устройствами без USB-хост-экрана?
на arduino.cc http://forum.arduino.cc/index.php?topic=576793, @Juraj