czwartek, 27 grudnia 2012

Logging to Raspberry without password

Once upon a time I was spending a lot of time working with Linux servers. It's a distant past, but I still can recall some tips. One of them, quite useful when it comes to playing with RPi, is logging without password. I don't mean to give up passwords and allow anyone to enter my realms, but rather to automate the whole process from trusted machine.

How to achieve that?

On your workstations you need to generate authentication keys:
myuser@myhost:~$ ssh-keygen 
Generating public/private rsa key pair.
Enter file in which to save the key (/home/myuser/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/myuser/.ssh/id_rsa.
Your public key has been saved in /home/myuser/.ssh/id_rsa.pub.
The key fingerprint is:
2d:2c:d5:d1:cc:cc:1a:aa:a3:11:28:da:1b:1a:2a:3a


When you have them, the next step is copying your public key to RPi:
myuser@myhost:~$ ssh-copy-id -i ~/.ssh/id_rsa.pub myuser@raspberrypi
myuser@raspberrypi's password: 
Now try logging into the machine, with "ssh 'myuser@raspberrypi'", and check in:

  ~/.ssh/authorized_keys

to make sure we haven't added extra keys that you weren't expecting.

And that's all.
From now on you will be automatically logged to your precious board.

środa, 26 grudnia 2012

Malinowo :)

W tym roku Mikołaj był przesłodki. Jak malina. Więc zaczyna się zabawa z nową płytką, czyli Raspberry Pi. Oby tylko czasu starczyło...

Pracę z Raspberry Pi wypada rozpocząć od przygotowania karty SD. Minimalny rozmiar karty do 2GB, ja użyję 8GB klasy 10.

Po włożeniu karty do czytnika, sprawdzamy urządzenie skojarzone z kartą:
df -h

Zakładajac, że jest to sdb, należy odmontować kartę:
sudo umount /dev/sdb1
a następnie za pomocą dd skopiować obraz na kartę
sudo dd bs=1M if=./2012-12-16-wheezy-raspbian.img of=/dev/sdb
Pomimo wielu zalet, dd ma zasadniczą wadę - nie informuje o postępie kopiowania. Jednakże można zmusić dd do współpracy. Najpierw trzeba poznać PID procesu. W tym celu otwieramy drugą konsolę:
ps aux | grep dd.*wheez
a następnie wysłać sygnał do procesu:
sudo kill -USR1 <PID>
W pierwszej konsoli dd łaskawie ujawni swoje tajemnice:

Kiedy karta jest gotowa, można za pomocą Gparted rozszerzyć partycję, tak by zajmowała całą kartę, jednakże nie jest to konieczne. Przy pierwszym starcie uruchomi się raspi-config, który umożliwia wstępną konfigurację malinki:


Z przydatnych ustawień:
  • expand_rootfs
  • change_pass
  • change_locale
  • change_timezone
  • ssh
  • boot_behaviour
Jeśli czegoś nie ustawimy, można konfigurator uruchomić ponownie:
sudo raspi-config
Po zakończeniu konfiguracji można się zalogować do systemu.

Pierwszym krokiem po uruchomieniu, jest nadanie stałego IP.
W pliku /etc/network/interfaces należy wpisać (wybierając odpowiednie IP :) )
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet static
address 192.168.1.10
gateway 192.168.1.1
netmask 255.255.255.0
network 192.168.1.0
broadcast 192.168.1.255

# w moim przypadku nie używam sieci bezprzewodowej
#allow-hotplug wlan0
#iface wlan0 inet manual
#wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
#iface default inet dhcp

Jeśli nie chcemy używać domyślnego użytkownika (pi), można dodać własnego:
sudo adduser myuser
A następnie nadać mu nieco większe uprawnienia:
sudo visudo
wpisując
myuser ALL=(ALL) NOPASSWD: ALL

Możemy jeszcze dodać naszego użytkownika do tych samych grup, do których należy pi. W tym celu (bedąc zalogowanym jako pi) wykonujemy polecenie:
sudo usermod -a -G adm,dialout,cdrom,sudo,audio,video,plugdev,games,users,netdev,input myuser
albo mniej zrozumiałe polecenie:
sudo usermod -a -G `groups | sed -e 's/pi //g;s/ /,/g'` myuser

Po przelogowaniu się na naszego nowego użytkownika możemy sprawdzić czy się udało:
groups

wtorek, 11 grudnia 2012

Szeregowo i kolorowo...

Dużo czasu minęło od ostatniego posta... Spręża brak, więc na dobry początek coś łatwego, szybkiego i... mało potrzebnego.

Potrzebowałem zobaczyć, jak skomplikowane jest komunikowanie się aplikacji uruchomionej na komputerze z Arduino. Oczywiście wybór padł na  złącze szeregowe :/

Pytanie, czym sterować, żeby się nie narobić... Albo serwo, a może jakaś dioda? A może dioda RGB? Akurat miałem pod ręką małe trójkolowe coś w wersji smd, więc...

Najpierw mała aplikacja w Processingu, ot trzy suwaki...


Każdy z "suwaków" aktualizuje poszczególne składowe, które następnie są łączone w jeden łańcuch i wysyłane przez port szeregowy do Arduino:

float mr = map(r, 0, 255, 0, 255);
float mg = map(g, 0, 255, 0, 255);
float mb = map(b, 0, 255, 0, 255);

String rgbString = str((int)mr) + " " + str((int)mg) + " " + str((int)mb) + "\n";
print("rgbString:"); println(rgbString);
port.write(rgbString);

Arduino zaś odbiera łańcuch i parsuje poszczególne składowe:

if (Serial.available() > 0) {
    redValue   = Serial.parseInt();
    greenValue = Serial.parseInt();
    blueValue  = Serial.parseInt();
        
    if (Serial.read() == '\n') {
        redValue   = constrain(redValue, 0, 255);
        greenValue = constrain(greenValue, 0, 255);
        blueValue  = constrain(blueValue, 0, 255);

        analogWrite(redPin,  redValue);
        analogWrite(greenPin,greenValue);
        analogWrite(bluePin, blueValue);
    }
}

Próby wysyłania poszczególnych składowych osobno, jako sekwencja bajtów, się nie sprawdziła, więc póki co pozostaje tworzenie łańcucha znaków...

A działa to mniej więcej tak:


Kody źródłowe: