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;
}

Walidacja numerów PESEL, NIP, REGON w Javascript i PHP

Ulepszone funkcje z tego wpisu. Aktualnie funkcje sprawdzają także sumy kontrolne zawarte w tych numerach, na podstawie Wikipedii. Wystarczy przeanalizować kody

Odmiany funkcji w Javascript i PHP są w pełni zgodne, to znaczy że dadzą taką samą odpowiedź.

Aktualizacja 2017-05-02:

  • Zamieniłem polskie nazwy zmiennych na angielskie;
  • Funkcje od PESEL sprawdzają czy data jest poprawna, tj. miesiąc nie większy niż 12 i dzień miesiąca nie większy niż 31. To rozwiązuje problemy opisane w komentarzach. Dziękuję za zwrócenie uwagi i dziękuję Panu Krzysztofowi Grabania za propozycję rozwiązania problemu.
  • Poprawione wcięcia itp.
  • Dodane formularze, gdzie można sobie potestować jak działają funkcje w wersji JS. Wersje PHP: http://test.vt0.pl/v/

Oczywiście jeśli użytkownik będzie chciał, to i tak da radę wprowadzić nieprawdziwe dane, ale dzięki tej walidacji uchronimy się przed omyłkowym wpisaniem danych z błędami w formularzu.

1. Walidacja PESEL:

Kod PHP:

function validatepesel($pesel) {
    $reg = '/^[0-9]{11}$/';
    if(preg_match($reg, $pesel)==false)
        return false;
    else
    {
        $digits = str_split($pesel);
        if ((intval(substr($pesel, 4, 2)) > 31)||(intval(substr($pesel, 2, 2)) > 12))
            return false;
        $checksum = (1*intval($digits[0]) + 3*intval($digits[1]) + 7*intval($digits[2]) + 9*intval($digits[3]) + 1*intval($digits[4]) + 3*intval($digits[5]) + 7*intval($digits[6]) + 9*intval($digits[7]) + 1*intval($digits[8]) + 3*intval($digits[9]))%10;
        if($checksum == 0) 
            $checksum = 10;
        $checksum = 10 - $checksum;
            
        return (intval($digits[10]) == $checksum);
    }
}

Kod Javascript:

function validatepesel(pesel) {
    var reg = /^[0-9]{11}$/;
    if(reg.test(pesel) == false) 
        return false;
    else
    {
        var digits = (""+pesel).split("");
        if ((parseInt(pesel.substring( 4, 6)) > 31)||(parseInt(pesel.substring( 2, 4)) > 12))
            return false;
        
        var checksum = (1*parseInt(digits[0]) + 3*parseInt(digits[1]) + 7*parseInt(digits[2]) + 9*parseInt(digits[3]) + 1*parseInt(digits[4]) + 3*parseInt(digits[5]) + 7*parseInt(digits[6]) + 9*parseInt(digits[7]) + 1*parseInt(digits[8]) + 3*parseInt(digits[9]))%10;
        if(checksum==0) checksum = 10;
            checksum = 10 - checksum;

        return (parseInt(digits[10])==checksum);
    }
}

Test:

READY

2.Walidacja NIP

Kod PHP:

function validatenip($nip) {
    $nipWithoutDashes = preg_replace("/-/","",$nip);
    $reg = '/^[0-9]{10}$/';
    if(preg_match($reg, $nipWithoutDashes)==false)
        return false;
    else
    {
        $digits = str_split($nipWithoutDashes);
        $checksum = (6*intval($digits[0]) + 5*intval($digits[1]) + 7*intval($digits[2]) + 2*intval($digits[3]) + 3*intval($digits[4]) + 4*intval($digits[5]) + 5*intval($digits[6]) + 6*intval($digits[7]) + 7*intval($digits[8]))%11;

        return (intval($digits[9]) == $checksum);
    }
}

Kod Javascript:

function validatenip(nip) {
    var nipWithoutDashes = nip.replace(/-/g,"");
    var reg = /^[0-9]{10}$/;
    if(reg.test(nipWithoutDashes) == false) {
        return false;}
    else
    {
        var digits = (""+nipWithoutDashes).split("");
        var checksum = (6*parseInt(digits[0]) + 5*parseInt(digits[1]) + 7*parseInt(digits[2]) + 2*parseInt(digits[3]) + 3*parseInt(digits[4]) + 4*parseInt(digits[5]) + 5*parseInt(digits[6]) + 6*parseInt(digits[7]) + 7*parseInt(digits[8]))%11;
        
        return (parseInt(digits[9])==checksum);
    }
}

Test:

READY

3. Walidacja REGON (9-cyfrowy):

Kod PHP:

function validateregon9($regon) {
    $reg = '/^[0-9]{9}$/';
    if(preg_match($reg, $regon)==false)
        return false;
    else
    {
        $digits = str_split($regon);
        $checksum = (8*intval($digits[0]) + 9*intval($digits[1]) + 2*intval($digits[2]) + 3*intval($digits[3]) + 4*intval($digits[4]) + 5*intval($digits[5]) + 6*intval($digits[6]) + 7*intval($digits[7]))%11;
        if($checksum == 10) 
            $checksum = 0;

        return (intval($digits[8]) == $checksum);
    }
}

Kod Javascript:

function validateregon9(regon) {
    var reg = /^[0-9]{9}$/;
    if(!reg.test(regon)) 
        return false;
    else
    {
        var digits = (""+regon).split("");
        var checksum = (8*parseInt(digits[0]) + 9*parseInt(digits[1]) + 2*parseInt(digits[2]) + 3*parseInt(digits[3]) + 4*parseInt(digits[4]) + 5*parseInt(digits[5]) + 6*parseInt(digits[6]) + 7*parseInt(digits[7]))%11;
        if(checksum == 10) 
            checksum = 0;
        
        return (parseInt(digits[8])==checksum);
    }
}

Test:

READY

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.

Ekran logowania i układ klawiatury

logon_keybrd

Jeśli na ekranie logowania masz jako domyślny układ klawiatury inny niż preferowany, ta instrukcja jest dla Ciebie. Zaloguj się, wejdź w panel sterowania -> W kategorii “Zegar, język i region” wybierz “Zmień układ klawiatury lub inne metody wprowadzania danych”. W oknie wybierz zakładkę “Administracyjne:

logon_keybrd02

Wybierz “Kopiuj ustawienia”:

logon_keybrd03

W otwartym oknie zaznacz oba checkboxy. Pozatwierdzaj wszystkie okna i gotowe. Pamiętaj, że zwykle prawidłowy układ klawiatury to “Polski (programisty)”.