poniedziałek, 30 lipca 2012

WaveShield na płytce prototypowej

"Shielda" do odtwarzania plików wav na Arduino można kupić. W tym celu musimy przeznaczyć ok 75 złotych, zakładając że układ dostaniemy. Możemy też zbudować sami, niespecjalnie się wysilając, a co ważniejsze płacąc nieco mniej, że o zabawie nie wspomnę :)

Wszystkie potrzebne elementy, instrukcję itd znajdziemy na stronie układu., więc nie będę szczegółowo wymieniał, co jest konieczne , może tylko najważniejsze elementy:
  • złącze do kart SD (~5 PLN)
  • układ 74HC125 (~1 PLN)
  • 12 bitowy przetwornik DAC - MCP4921 (~10 PLN)
  • wzmaczniacz  TS922IN (~5 PLN)
Jak widać całość wyniesie nieco ponad 20 złotych. Chyba zatem warto się pokusić o chociażby wypróbowanie shielda, montując go na płytce prototypowej. 
Prawdę mówiąc część modułu można wykonać sobie wcześniej, wystarczy spojrzeć na poprzedni post, a czytnik kart SD może sobie leżeć na podorędziu i być pomocnym w różnych przypadkach, także wtedy, gdy chcemy zachęcić Arduino do muzykowania, mówienia itp.

Schemat układu bez czytnika kart SD (w oparciu o oryginalny projekt):


Przetwornik MCP łączymy z Arduino następująco:
  • CS do pinu D2 (Digital 2)
  • SCK do pinu D3
  • SDI do pinu D4
  • LDAC do pinu D5
Karta SD jest podłączana do Arduino prawie tak samo, jak w poprzednim poście. Wyjątek stanowi pin CS karty, który uprzednio był podłączony do pinu D4, teraz zaś musi być podłączony do pinu D10.

Po zmontowaniu cały układ wygląda następująco:


A to takie "Hello World" - kod programu wziąłem z przykładu dołączonego do biblioteki WaveHC (PiSpeakHC), zmieniając jedynie nazwę pliku do odtworzenia (pozbywszy się uprzednio logiki związanej z deklamacją liczby PI):






środa, 25 lipca 2012

Karta SD (a miał być Robot)

Roboty lubią zarówno mali chłopcy, ci więksi jak i ci naprawdę duzi. Przynajmniej większość "chłopców", których znam. Z reguły lubią się bawić robotami, ale są też tacy, których bawi/bawiłoby stworzenie takiego "cudeńka". Mógłbym napisać, że jestem w tej drugiej grupie, ale... Poza "Wallym" nie zrobiłem jeszcze całego robota. Przy okazji, to jest Wally:


Nie dość, że miał dość ograniczone funkcje, to do tego byłem jedynie pomocnikiem.
Byłoby sympatycznie samemu coś "wydziergać". Póki co niestety kończy się na "byłoby sympatycznie". Ale... Pojawiło się światełko w tunelu, choć wcale roboty nie były mi wtedy w głowie. Szukałem sposobów odtwarzania dźwięku przez Arduino. Spośród znalezionych rozwiązań spodobały mi się dwa:
Niestety, póki co nie udało mi się dostać układu SpeakJet, więc pozostaje WaveShield. Nie żeby był gorszy, po prostu części są dostępne, co więcej - nie ma potrzeby sięgania po SMD!
W zasadzie nie ma problemów ze zmontowaniem układu do momentu zabrania się za czytnik kart SD. Można kupić, można spróbować samemu zrobić. Co wybrać...
Cóż, wybrałem ciemną stronę mocy i powstało to:


Płytka była projektowana późnym wieczorem i drapana, do tego jeszcze miała błędy, a że do tego specjalnie estetyczna nie jest, więc daruję sobie wrzucanie projektu. Powiedzmy że gotowy układ realizuje poniższy schemat,


który wziąłem ze strony shielda, a układ wyjść wygląda tak:


Ironicznie, ciesząc się że nie ma konieczności sięgania po SMD, znalazłem w swoich zasobach tylko jeden układ 74HC125, właśnie w takiej postaci :/.

Moduł czytnika kart SD podłączamy następująco:
  • MOSI do pinu 11
  • MISO do pinu 12
  • CLK do pinu 13
  • MMC_CS do pinu 4
Powyższy układ działa na Arduino 2009, Nano itp.

Po podłączeniu układ wygląda następująco:



Z biblioteki SD wybieramy przykład "CardInfo", wgrywamy i po uruchomieniu możemy dostać coś podobnego:



I zasadniczo tyle. Post zaczynał się szumnie aluzją do robienia robotów, miał pierwotny tytuł "Robot cz. 1" i... ani się obejrzałem już północ. O robotach coś na pewno będzie :)
Niestety, gdybym chciał wrzucić wszystko co planowałem w jeden post, sam bym się potem pogubił, więc nieco lepiej będzie podzielić całość na małe części.  A oto co nas jeszcze czeka:

  • "aparat głosowy", czyli WaveShield
  • usta robota, czyli co można zrobić z AN6884
  • oczy robota, czyli moduł HC-SR04.
Zatem... CDN


niedziela, 22 lipca 2012

BMA180 i Arduino cz. 1

Jakiś czas temu zakupiłem moduł z akcelerometrem BMA180. Jednakże od początku były jakieś "ale". Pierwsza sprawa to cyfrowy interfejs - nie wystarczy mierzyć napięć, trzeba być dość rozmownym, by wydostać dane z układu. Drugim problemem był brak biblioteki dedykowanej na Arduino. Co prawda w sieci znalazłem nieoficjalne wsparcie, ale... Dlaczegóż by nie napisać czegoś samemu? No i trzeci problem - niezgodniość poziomów logicznych. Układ BMA180 pracuje w logice 3.3V,  natomiast Arduino w 5V.

Jak mawiają ludy anglojęzyczne "first things first" - jeśli chcemy używać układu trzeba mieć konwerter. Można go zakupić, zresztą wiele nie kosztuje, ale dostawa chwilę trwa. Można zbudować, schemat jest dostępny na stronie producenta, ale... Trzeba mieć odpowiednie tranzystory. Jak się okazało tranzystorów BSS138 nie mogłem dostać w znanych mi wrocławskich sklepach, więc trzeba było improwizować. Z tego typu tranzystorów łatwo dostać BS170, więc...

Schemat ideowy części konwertera:



A moduł wygląda tak:


Przed rozpoczęciem pracy z modułem trzeba się zdecydować, przez jaki interfejs będziemy się komunikować z układem. Mamy do dyspozycji SPI (4 przewody) i I2C (2 przewody). Osobiście wolę I2C, więc dalsze rozważania będą brać po uwagę tylko ten interfejs.

Jeśli chcemy włączyć komunikację po I2C, wystarczy na pinie CS ustawić stan wysoki (jak się można domyślić, stan niski przełącza komunikację na SPI).

Kompletny schemat układu poniżej:


Po podłączeniu otrzymujemy coś takiego:



Najmniej skomplikowanym sposobem weryfikacji połączenia jest odpytanie układu o jego ID:

#include 
#include 


#define BMA180_ADDR 0x40
#define CHIP_ID     0x00

byte val;

void setup() {
  Serial.begin(9600);
  Wire.begin();
  val = readI2C((uint8_t)CHIP_ID);
  Serial.print("CHIP_ID=");
  Serial.println(val);
}

void loop() {
}

byte readI2C(uint8_t offset) {
  byte val;
  Wire.beginTransmission(BMA180_ADDR);
  Wire.write((uint8_t)offset);
  Wire.endTransmission();

  Wire.requestFrom(BMA180_ADDR, 1);
  while (Wire.available()) {
    val = Wire.read();  
  }
  return val;
}

Jeśli w terminalu otrzymam wartość CHIP_ID=3,

 możemy zaczynać bardziej skomplikowane zabawy z akcelerometrem. 

poniedziałek, 16 lipca 2012

Arduino Nano po polsku

W ostatnim poście pisałem o tanim Arduino na mikrokontrolerze Atmega8. Moduł jest tani, bo koszt całości zamyka się w 20 zł, ale nieco bardziej uciążliwy w użyciu, jeśli chcemy szybko prototypować. Na szczęście AVT wypuściło inny kit - AVT 1622 - Minimoduł z Atmega8
Układ ten, w odróżnieniu od poprzedniego, posiada wbudowany konwerter UART<->USB, zatem może być używany prawie jak oryginalne Arduino Nano.

Decydując się na zakup kitu, wybieram samą płytkę. Choćby dlatego, że finalnie będzie to minimoduł z Atmegą 328.

Lista potrzebnych elementów:
  • płytka drukowana modułu
  • Atmega328
  • FT232RL
  • 78M05 (TO252)
  • 3x 470om 0805
  • 10k 0805
  • 2x 1k 0806
  • 2x 10mikroF . 16V
  • 4x 100nF 0805
  • 2x 22pF 0805
  • niski kwarc 16 MHz
  • diody led smd 0805 - zielona, czerwona, żółta
  • gniazdo mini usb
  • goldpiny

Instrukcja kitu zaleca rozpoczęcie montażu od mikrokontrolera, kondensatorów i diod LED na jednej stronie. W kolejnym kroku FT232, stabilizator, rezystory i kontensatory po drugiej stronie, a na końcu gniazdo USB i goldpiny.
Lutowanie elementów smd jest relatywnie proste, nawet dla takiego początkującego jak ja, jeśli się ma pod ręką plecionkę lutowniczą:



Po zlutowaniu moduł wygląda tak:

Jeszcze można zauważyć mnóstwo kalafonii po "odsączaniu" nadmiaru cyny. Ważne, że sposób działa...
Po zakończeniu lutowania można moduł podłączyć do komputera - powinna świecić się zielona dioda (PWR), a diody RX i TX pobłyskiwać od czasu do czasu. Dodatkowo, w IDE powinien pojawić się nowy port. Jeśli nic takiego się nie dzieje, trzeba sprawdzić, czy np drobinki lutu nie zwierają pinów złącza USB czy też układów sclaonych. Nim wgramy bootloader sprawdźmy FUSE bity:
avrdude -p m328p -c stk500v2 -P /dev/ttyACM0 -U lfuse:r:-:h -U lfuse:r:-:b -U hfuse:r:-:h -U hfuse:r:-:b 
i otrzymujemy:
avrdude: Device signature = 0x1e950f 
reading lfuse memory: 0x62 
reading hfuse memory: 0xd9 

Teraz możemy wgrać bootloader. Podłączamy moduł do programatora i za pomącą IDE ładujemy oprogramowanie. Możemy sprawdzić FUSE bity ponownie. To co powinniśmy otrzymać to 0xff (lfuse) i 0xda (hfuse).
Mogłoby się wydawać, że to już koniec. Niestety nie. Próba załadowania programu z IDE z reguły skończy się komunikatem:
Binary sketch size: 1,084 bytes (of a 30,720 byte maximum) avrdude: stk500_recv(): programmer is not responding 
  Nasze nowe Arduino będzie trudno programować przez USB, gdyż moduł dostarczany przez AVT nie posiada możliwości autoresetu, co więcej przycisku RESET też na płytce nie ma. O ile drugi problem można usunąć przez podłączenie zewnętrznego przycisku do resetowania układu, o tyle ja osobiście wolę nic nie naciskać. Prostym rozwiązaniem jest dodanie połączenia pinu DTR# układu FT232RL poprzez kondensator 100nF z pinem RESET mikrokontrolera. Do tego celu najlepiej użyć bardzo cienkiego przewodu, choć jak nie ma nic pod ręką, można użyć przewodu ze skrętki:
Moje lutowanie wygląda tak:

Może nie najwyższych lotów, ale nie ma zwarć, a wgrywanie programów nie stanowi już żadnego problemu.

Mapa pinów modułu:

wtorek, 3 lipca 2012

Niedrogie Arduino na Atmega8

Od pewnego czasu "bawię" się Arduino. Prosty sposób, by osoba nie mająca doświadczenie z mikrokontrolerami mogła się nimi zająć, bez żmudnego wgryzania się w detale.
Jednakże kiedy przychodzi moment, że trzeba przejść od prototypu to finalnego produktu, robi się problem. Najlepiej by było zaprojektować płytkę dedykowaną pod konkretne rozwiązanie. Ale kto ma czas? A co jeśli za jakiś czas zrezygnuję z budowanego urządzenia? Itd, itp...
Można użyć Arduino... Ale raz że duże, dwa - ciut drogie. Na szczęście niedrogie rozwiązanie istnieje; jest to wypuszczony przez AVT kit AVT2892/2 - minimoduł z mikrokontrolerem Atmega8.
Można zamówić cały kit, ale ja zamawiam tylko płytkę - z reguły atmegę mam, a poza kwarcem nic innego nie potrzebuję (ale o tym za chwilę).

Składanie modułu nie jest specjalnie trudne, nawet osoba nie mająca doświadczenia w lutowaniu SMD powinna sobie poradzić.

Moja lista elementów:

  • płytka
  • Atmega8A
  • kwarc 16MHz
  • 2x 22pF 0806
  • goldpiny
Nie lutuje z reguły układu stabilizatora, bo zasilanie to najczęściej osobna sprawa.

Po zlutowanie otrzymujemy zgrabny moduł, którego konfiguracja pinów wygląda następująco:


Kolejnym krokiem jest przygotowanie programatora - jakby nie patrzeć będzie potrzebny, gdyż albo będę używać modułu USB<->RS232, a to wymaga bootloader, albo wgrywać programy bezpośrednio, co wymaga programatora.
Osobiście używam AVRPROG v2 (firmy AndTech). Z początku nie chciało działać, ale po chwili odgadłem powód - niepoprawna konfiguracja w pliku programmers.txt :

avrisp.name=AVR ISP
avrisp.communication=serial
#oryginalna wartość: stk500v1
avrisp.protocol=stk500v2

Teraz tylko upload bootloadera, co warto wykonać, bez względu na to, jak będziemy w przyszłości wgrywać programy. Po prostu zostaną ustawione FUSE bity :)

A zweryfikowć FB można następująco:

avrdude -p atmega8 -c stk500v2 -P /dev/ttyACM0 -U lfuse:r:-:h -U lfuse:r:-:b -U hfuse:r:-:h -U hfuse:r:-:b



Powinniśmy otrzymać: