Sensor dotykowy na AVR, udało się bez Qtouch library

IMAG0328W końcu udało mi się zmusić AVR’ki do odczytu dotykowych przycisków. Biblioteka Atmel Qtouch kusiła, ale za nic nie byłem wstanie jej rozgryźć, a o rozmiarze nie wspomnę. Poczytałem trochę teorii, znalazłem jakieś przykłady i udało się. Pierwszym efektem jest ten moduł. Jak działa w praktyce:

Jak działa w teorii:
Płytki czujników dotyku działają jak kondensatory, ładowane przez rezystor. Mikroprocesor ładuje ten układ RC, mierząc czas. Ponieważ R jest stałe, czas ładowania jest zależny od pojemności. Pojemność zmienia się gdy przykładamy palec – staje się on dielektrykiem. Aby układ działał, należy zadbać o kilka elementów:
-Pojemność takiego „kondensatora” jest bardzo mała. Aby wydłużyć czas ładowania, stosuje się rezystory o dużej wartości (ja użyłem z braku innych 10M, lepsze byłyby około 2-5M om).
-Jeden sensor wymaga jednego pinu do odczytu, i jednego do ładowania, z tym że ten drugi może obsługiwać jednocześnie wiele czujników.
-Czasy są tu bardzo niewielkie; nie ma po co używać funkcji opóźniających; sam obrót pętli pomiarowej jest wystarczająco długi.
-Zmiany pojemności są także niewielkie, dlatego ważne jest aby ta zmiana po przyłożeniu palca była możliwie duża. Dlatego płytki mają powierzchnię w postaci siatki, aby zmniejszyć ich własną pojemność. Wbrew intuicji, im większe pola sensorów, tym niekoniecznie lepiej.
-W takich układach bardzo ważne jest zastosowanie jak najkrótszych ścieżek, aby zmniejszyć szkodliwe pojemności.
-Ważne jest też wylanie dookoła masy, która będzie ekranować zakłócenia i stanowić drugą elektrodę kondensatora.
-Jak wynika z powyższego opisu, pomiar nie polega na wykryciu pojemności ludzkiego ciała względem ziemi, ani niczego takiego. Palec człowieka jest dielektrykiem w polu elektrycznym kondensatora utworzonego z pola czujnika i pobliskiego pola masy.

Download:

Tiny13_2x_touch_sources_firmware

tiny13_2x_touch

Mini stacja czujników online

Spakowany sketch Arduino: Pobierz sketch Mini stacja czujników online

Wymagana biblioteka (z odpowiednimi przeróbkami): EtherCard

Podłączenie:

  • Moduł Ethernet pod złącze ICSP na Arduino (MOSI – SI, MISO – SO, SCK – SCK, GND-GND), pin CS do pinu 8, VCC do 3,3V
  • DHT11 wyjście pod pin 12
  • MQ7 wyjście analogowe pod pin A0
  • Fotorezystor pomiędzy VCC a pin A1, który ściągamy do masy rezystorem 1KΩ
  • Moduł Ethernet podpięty do routera

Aby odnaleźć IP, pod którym widnieje nasz układ proponuję zalogować się do panelu administracyjnego routera, u mnie była to zakładka/okienko „DHCP Client List”. Odczyt z czujnika tlenku węgla w normalnych warunkach wynosi poniżej 50 (<250mV). Potraktowanie go jakimikolwiek oparami powoduje szybką reakcję i skok napięcia powyżej 1V (przy bliskim rozpyleniu).

 

Mój pierwszy robot Arduino

Kod źródłowy:

//ROBOT jeżdżący
//LCD I2C; 2x silniki, sonarr HC-SR04, tsop4836 RC5
//Piny:
/*
12: Silnik prawy kierunek;
11: Silnik prawy PWM;
4: Silnik lewy kierunek;
5: Silnik lewy PWM;
8: Sonar Echo;
9: Sonar trig;
10: TSOP4836;
SDA/SCL:  LCD 16x2;

*/
#include <Wire.h>  // Comes with Arduino IDE
#include <FastIO.h>
#include <I2CIO.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>
#include <LiquidCrystal_SR.h>
#include <LiquidCrystal_SR2W.h>
#include <LiquidCrystal_SR3W.h>



LiquidCrystal_I2C lcd(0x20, 4, 5, 6, 0, 1, 2, 3, 7, POSITIVE);  // Set the LCD I2C address
const int echo = 8;
const int trig = 9;
long duration, cm;

void setup(){
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(8, INPUT);
  pinMode(9, OUTPUT);
  pinMode(10, INPUT);

  analogWrite(6,0);
  analogWrite(5,0);
  digitalWrite(7,LOW);
  digitalWrite(4,LOW);
  digitalWrite(9,LOW);
  
  lcd.begin(16,2);         // initialize the lcd for 20 chars 4 lines]
  lcd.setBacklightPin(7, NEGATIVE);
  lcd.setBacklight(0);
// NOTE: Cursor Position: CHAR, LINE) start at 0  
  lcd.setCursor(0,0); //Start at character 4 on line 0
  lcd.print("ROBOT! 4");


}
void loop(){
int wynik;
lcd.setCursor(0,1);
lcd.print("L:           ");
lcd.setCursor(3,1);
wynik = pomiar();
if(wynik<3000){
  lcd.print(wynik);
  
    if(wynik<30)
    {
      digitalWrite(7,LOW);
      digitalWrite(4,LOW);
      analogWrite(6,255);
      analogWrite(5,255);
    }
    if((wynik>30) && (wynik<80))
    {
      digitalWrite(7,LOW);
      digitalWrite(4,LOW);
      analogWrite(6,0);
      analogWrite(5,0);
    }

    if(wynik>50)
    {
      digitalWrite(7,HIGH);
      digitalWrite(4,HIGH);
      analogWrite(6,0);
      analogWrite(5,0);
    }


}
delay(10);


}
int pomiar(void)
{
  pinMode(trig, OUTPUT);
  digitalWrite(trig, LOW);
  delayMicroseconds(2);
  digitalWrite(trig, HIGH);
  delayMicroseconds(10);
  digitalWrite(trig, LOW);
   
  // Read the signal from the sensor: a HIGH pulse whose
  // duration is the time (in microseconds) from the sending
  // of the ping to the reception of its echo off of an object.
  pinMode(echo, INPUT);
  duration = pulseIn(echo, HIGH);
  return microsecondsToCentimeters(duration);
}

int microsecondsToCentimeters(long microseconds)
{
// The speed of sound is 340 m/s or 29 microseconds per centimeter.
// The ping travels out and back, so to find the distance of the
// object we take half of the distance travelled.
return microseconds / 29 / 2;
}

Mini odbiornik podczerwieni na ATTINY10

Malutki, zasilany z jednej bateryjki CR1220 odbiornik kodu RC5 dekodowany za pomocą AVR ATTiny10. Układ steruje dwiema diodami w trybie włącz/wyłącz. W celu uniknięcia niezamierzonych zmian stanów na wyjściach, odczytywany jest bit Toggle z ramki RC5.
Inspiracja: http://www.youtube.com/watch?v=ghtCYlqUlWQ
Wiedza: http://mikrokontrolery.blogspot.com/2011/03/IR-podczerwien-transmisja-standard-pilot-kurs.html
Wsparcie:http://www.elektroda.pl/rtvforum/viewtopic.php?t=2651455&highlight=
Kody źródłowe C Atmel Studio 6.1

tiny10_ir PCB do termotransferu

Porównanie Atmega8 Atmega8A Atmega88 Atmega88PA

Aby nie kupować dinozaurów. Dane, które ciężko znaleźć w takiej formie.

Atmega8
Atmega8A
Atmega88
Atmega88PA
4,5-5,5V
2,7-5,5V
2,7-5,5V
1,8-5,5V
0-16MHz
0-16MHz
0-10MHz; 0-20MHz@4,5-5,5V
0-20MHz
3xPWM
3xPWM
6xPWM
6xPWM
5 sleep modes
5 sleep modes
5 sleep modes
6 sleep modes
PCINT
PCINT
Sensor temperatury
Active: 3,6mA
Active: 3,6mA
Active: 250uA@1MHz
Active: 0,2mA(200uA)
Idle: 1,0mA
Idle: 1,0mA
PowerDown: 0,5uA
PowerDown: 0,5uA
PowerDown: 0,1uA
PowerDown: 0,1uA
Qtouch support
Qtouch support
UART in SPI mode
UART in SPI mode
Vref 2,56V
2,56V
1,1V
1,1V
3,44zł TQFP32
3,98zł TQFP32
6,52zł TQFP32
5,40zł TQFP32
Porównanie parametrów mikrokontrolerów Atmega8XXX

Proszę o pomoc w rozbudowie tabelki.

Detektor promieniowania – prototyp

Konstruuję aktualnie licznik Geigera. Udało mi się nabyć na aukcji tubę STS-5 (CTC-5) która służy za detektor promieniowania (głównie beta). Tuba tak wymaga zasilania stałym napięciem ok. 400V, jednak pobiera bardzo mało prądu, i to tylko podczas detekcji. Złożyłem więc prototyp, który o wykryciu cząstki informuje charakterystycznym trzaskiem i mignięciem diodą LED.

W docelowej konstrukcji znajdzie się któraś Atmega (8 lub 88), wyświetlacz LCD 16×2 i wykonana płytka drukowana. Jako obudowę planuję użyć CP-Z-97/B.
Dodam jeszcze, że w projekcie przetwornicy bardzo pomógł mi użytkownik portalu Elektroda.pl psooya.

Programowanie PIC – pierwsze problemy

Same procesorki PIC nie są najgorsze, mimo że nie wyróżniają się jakoś specjalnie od AVR. Dużo więcej problemów sprawia natomiast środowisko programistyczne. Zainstalowałem MPLAB X IDE v.1.85 wraz z kompilatorem C XC8 (v 1.20).
Ogólnie w porównaniu do AVR jest dużo gorzej. Kompilator w wersji darmowej nie pozwala wybrać optymalizacji, co oznacza że:
1) Nasz kod wynikowy będzie prawdopodobnie dużo za duży;
2) Nie wiemy, czy poprawnie zachowywać się będą funkcje typu „delay()”;

Kolejny problem: brak jednoznaczności. Wiele przykładowych kodów znalezionych w internecie nie zadziała. Brak „typowych” bibliotek jak inttypes.h, lub delay.h. Brzmi to może śmiesznie, ale uruchamiając pierwszy program typu „Hello World” migający diodą, brakuje takich funkcji.

Napotkałem dziwne problemy z ustawianiem bitów. Wydają się nie działać kody tego typu:

T2CON |= (1<<TMR2ON)|(1<<T2CKPS1);

, natomiast kod taki:

T2CON = 0x06;

już tak. O co chodzi?
Nie spodziewałem się, że będzie można wykonywać operacje na pojedynczych bitach. Tymczasem taki zapis jest poprawny:

TMR2ON =1;

Zauważyłem, że niektóre rejestry (dokładnie np. STRA) nie zerują się po resecie.

Nie mogę się też połapać, jak ustawiać w programie bity konfiguracyjne procesora. Można znaleźć trzy składnie.
Pierwsza:

#FUSES NOWDT

Druga:

#pragma config WDTEN  = OFF

I trzecia:

__config    _WDT_OFF

Której używać?

Jeśli macie sugestie, jak rozwiązać moje problemy, proszę piszcie w komentarzach.

Początek programowania PIC

pic
Dzisiaj po raz pierwszy zaprogramowałem procesor z rodziny PIC!
Użyty układ to PIC16F690.
Programator brenner8 mini zakupiłem na aukcji internetowej za śmieszne pieniądze. Mikroprocesor otrzymałem w postaci próbki od firmy Microchip. Parę słów o nim:

  • 4KB Pamięci programu
  • 256B RAM
  • 256B EEPROM
  • 17 portów I/O
  • 2 timery 8-bit
  • 1 timer 16-bit
  • 12 kanałowy 10-bit przetwornik AC (ADC)
  • Watchdog
  • USART
  • 2 komparatory analogowe
  • Programowane źródło odniesienia! (w pewnym sensie przetwornik D/A)
  • Oddzielny moduł PWM, do 4 wyjść
  • Interfejs I2C (TWI w AVR)
  • Programowanie w układzie (ICSP) (ISP w AVR)
  • Interfejs SPI
  • Wewnętrzny oscylator
  • Brown-out Reset (BOR) – odpowiednik BOD w AVR)
  • Zasilanie 2.0-5.5V

Jak widać, jest to w pewnym sensie odpowiednik ATMEGA48.

Układ podpięty do programatora „zaskoczył” od razu.

UPDATE: Kolega albertb zwrócił uwagę, że pamięć tego MCU odpowiada 8KB flash w AVR. Jest to więc bardziej odpowiednik ATMEGA88. Proszę pamiętać, że nie da się dokładnie porównać obu rodzin.

Mini płytka testowa ATMega8 AVR dla początkujących – jeszcze kilka słów

Płytka testowa jest bezpośrednią reakcją na informacje prezentowane na blogu mikrokontrolery.blogspot.com odnośnie startu z mikrokontrolerami AVR. Chciałem zaprezentować praktyczną i satysfakcjonującą realizację minimalistycznego podejścia do tematu nauki ich obsługi. Płytka wymaga znajomości podstaw elektroniki oraz umiejętności lutowania. Moim celem nie było zaprojektowanie układu, który wykona przedszkolak. Chciałem po pewnym czasie spędzonym z lutownicą mieć możliwość podłączenia do mikroprocesora maksymalnie łatwo jakiś peryferii, aby potem zająć się jedynie obsługą programową oraz oglądaniem efektów.

Bez lutowania można się obejść wtedy przez naprawdę długi czas. Ważne jedynie jest przygotowanie sobie odpowiednich „klocków” do zabawy. A są to w moim przypadku:

  • Wspomniana płytka testowa
  • Programator USBAsp z kabelkiem IDC10
  • Konwerter USB/RS232 zakończony kabelkiem z 4 oddzielnymi gniazdami goldpin (Vcc, GND, RxD, TxD)
  • Płytka stykowa
  • Różne kabelki zakończane wtykami i/lub gniazdami goldpin
  • Różne moduły

Dlaczego Atmega8A?

  • Bardzo dobry stosunek możliwości/cena (jak nie jeden z najlepszych wśród AVR)
  • Szeroki zakres zasilania (2,7-5,5V), nie ma problemów z konwersją napięć przy peryferiach na 3,3V.
  • Taktowanie do 16MHz. W końcowych rozwiązaniach trzeba dbać o oszczędność energii, ale w celach testowych zawsze lepiej mieć zapas mocy, a potem dopieszczać program.

Trwają prace nad podobną płytką, tylko z MCU w obudowie TQFP.

Drobna uwaga: płytka nie zawiera zabezpieczenia przed odwrotnym podpięciem zasilania. Jeśli będzie trzeba, dodam takowe w postaci diody Schottkiego oraz bezpiecznika polimerowego.