Нужен совет

Информация из первых уст

Наши авторы

Иван Парфенов

Кирилл Анофриев

Павел Егоров

Анна Киросова

Как восстановить электронную книгу

Есть способ для программного восстановления электронных книг - портативных медиа плееров. Способ работает на книгах фирм Effire, Ritmix, Texet, Teclast и др китайского производства. 
 

Подключение внешнего Wi-Fi адаптера к планшету на андроид 4

#!/system/bin/sh

 

ip link set wlan0 down

iwconfig wlan0 channel auto

iwconfig wlan0 Bit 54Mb/s

iwconfig wlan0 essid 'SSID name'

sleep 10

 

SD Card Wav плеер на ардуино

В продолжение темы про Arduino - представляю вашему вниманию Wav-плеер с чтением с SD-карты. Суть проста - записываете на sd карточку любимые композиции в формате wav и слушаете их с помощью Ардуино. Для этого проекта я использовал клон ардуино - Seeeduino 2.21, несущим на своем борту микроконтроллер AtMega328P. Плата имеет переключатель на 3.3-5 вольт, что здорово экономит время при проектировании устройств с 3.3 вольтовой периферией.

Итак, для сборки wav-плеера имеем:

  • Seeduino
  • SD-карт ридер, т.е. гнездо для карт SD. Можно взять переходник MicroSD-SD, если будете использовать MicroSD-карты
  • Динамик с конденсатором на 1-10 мкф

Для подключения карт SD к оригинальной ардуино нужен делитель напряжения с 5 до 3.3 вольт. Собирается он на резисторах 1.8к и 3.3к. Однако в нашем случае достаточно просто переключить плату на работу в режиме 3.3 вольта. Карта памяти будет общаться с seeduino по протоколу SPI. Для этого нужно ее подключить к плате 4-я проводами и два провода оставить под питание (помним про 3.3 вольта).

Схема плеера выглядит так:

Arduino sd wav player

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

Собрали, теперь разбираемся с прошивкой. Код Wav SD-плеера следующий:

 

#include <Fat16.h>
#include <Fat16Config.h>
#include <Fat16mainpage.h>
#include <Fat16util.h>
#include <FatStructs.h>
#include <SdCard.h>
#include <SdInfo.h>
 
SdCard card;
Fat16 file;
 
int speakerPin = 6;
 
volatile boolean playing = false;
String playlist = "";//non volatile since it is not used by loop while interrupts are on
 
boolean firstRampUp;//non volatile since it is not used by loop while interrupts are on
 
uint32_t sample;//non volatile since it is not used by loop while interrupts are on
uint32_t sounddata_length;//non volatile since it is not used by loop while interrupts are on
 
// This is called at 8000 Hz to load the next sample.
ISR(TIMER1_COMPA_vect)
{
    if (playing) {
        if (firstRampUp) {
            if (OCR0A >= 128) {
                firstRampUp = false;
           
                OCR0A = file.read();
                sample++;
            } else {
                OCR0A++;
            }
        } else {
            if (sample >= sounddata_length) {
                if (OCR0A == 0) {
                    stopPlayback();
                } else {
                    OCR0A--;
                }
            } else {
                OCR0A = file.read();
            }
 
            sample++;
        }
    }
}
 
void startPlayback()
{
    firstRampUp = true;
 
    sample = 0;
    
    file.open(nextsound(), O_READ);
    file.seekSet(46);//skip header bytes
 
    sounddata_length = file.fileSize() - 4000;//skip garbage bytes at the end, is it a converter issue ?
 
    bitSet(TCCR0A, COM0A1);
    bitClear(TCCR0B, CS01);
 
    cli();
    
    bitSet(TCCR1B, WGM12);
    bitClear(TCCR1A, WGM10);
    bitClear(TCCR1B, CS11);
    
    OCR1A = F_CPU / 8000;
 
    bitSet(TIMSK1, OCIE1A);
 
    sei();
 
    playing = true;
}
 
void fixInternals()//set back to arduino default settings of interrupts, timers etc...
{
    bitClear(TCCR0A, COM0A1);
    bitSet(TCCR0B, CS01);
 
    bitClear(TCCR1B, WGM12);
    bitSet(TCCR1A, WGM10);
    bitSet(TCCR1B, CS11);
 
    OCR1A = 0;
 
    bitClear(TIMSK1, OCIE1A);
}
 
void stopPlayback()
{
    fixInternals();
 
    file.close();
 
    playing = false;
}
 
const char* nextsound()
{
    String next = "";
 
    int space = playlist.indexOf(" ");
    if (space != -1) {
        next = playlist.substring(0, space);
 
        playlist = playlist.substring(space + 1);
    } else {
        next = playlist;
 
        playlist = "";
    }
 
    next = next + ".WAV";
 
    int l = next.length() + 1;
    char nextcstr[l];
    next.toCharArray(nextcstr, l);
 
    return nextcstr;
}
 
void setup()
{
    pinMode(speakerPin, OUTPUT);
    
    card.init();
    Fat16::init(&card);
}
 
void loop()
{
    if (playlist == "") {
        playlist = "song1 song2 song3";
 
        delay(3000);
    }
 
    startPlayback();
 
    while (playing) {;}
}
 
/*
"byte"-"bit"-"default value"-"pcm value"
TCCR1B CS10 -> 1    1
TCCR0B CS00 -> 1    1
TCCR0A WGM01 -> 1    1
TCCR0A WGM00 -> 1    1
TCCR0A COM0A0 -> 0    0
TCCR0A COM0B1 -> 0    0
TCCR0A COM0B0 -> 0    0
TCCR0B WGM02 -> 0    0
TCCR0B CS02 -> 0    0
TCCR1B CS12 -> 0    0
TCCR1A WGM11 -> 0    0
TCCR1B WGM13 -> 0    0
 
TCCR0A COM0A1 -> 0    1
TCCR1B WGM12 -> 0    1
TIMSK1 OCIE1A -> 0    1
TCCR0B CS01 -> 1    0
TCCR1B CS11 -> 1    0
TCCR1A WGM10 -> 1    0
 
OCR1A -> 0    varies
*/
Для нормальной компиляции прошивки вам понадобиться библиотека fat16lib. Скачать ее можно по ссылке. Скачанную библиотеку распаковываем в папку с библиотеками ардуины и указываем ей имя FAT16. Перезагрузите программу Arduino и папка появиться в списке библиотек.  Закачивайте скетч в плату. 
Теперь насчет распиновки - в файле SdCard.h из библиотеки fat16lib прописаны значения выводов, к которым нужно подсоединить SD карту. Менять можно только пин SPI_SS_PIN. По умолчанию ничего менять не нужно. 
Динамик подключаете через конденсатор к ножке D6. 
Карта память должна быть отформатирована только в fat16. Я использовал карту на 256 Мб.
Музыкальная композиция должна быть в формате WAV PCM Mono 8kHz 8 bit. Удобный перекодировщик Switch Sound File Converter. Названия композиций на карте памяти должны иметь вид ххх.wav, а в прошивке в строке

        playlist = "song1 song2 song3";

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

Вот что в итоге получилось:

Wav Sd-плеер Ардуино

Ссылка на оригинал: http://arduino.cc/forum/index.php?topic=71998.0