ลิงก์ผู้สนับสนุน

วันอังคารที่ 19 มีนาคม พ.ศ. 2556

[Raspberry Pi] ทำเครื่อง รับ ส่ง รหัส morse




หลังจากที่ควบคุมขา GPIO กันได้แล้ว ต่อมา เนื่องจากว่าผมไม่รู้จะทำอะไรกับเจ้าขา GPIO ดี ก็เลยนึกเล่นๆไป ได้เครื่อง รับ-ส่ง รหัสมอสมาครับ

โดยในภาพ (และในสคริป) จะใช้ไฟจากขา #24 แล้วก็จากอีกขาหนึ่งที่มันจ่ายไฟ 3V ได้ เรียกไม่ถูกว่าอะไร 555

GPIO #24 -> ตั้งค่าเป็น output สำหรับจ่ายไฟ จากสคริป
3V -> สำหรับจ่ายไฟ ถ้าเราต้องการกดส่งรหัสมอสเอง
GPIO #23 -> ตั้งค่าเป็น input สำหรับรับรหัสมอส



มาดูที่ฝั่งตัวส่งรหัสมอสกันก่อน

#!/usr/bin/perl
$gpio=24;
$delay=0.25;                   #Delay of send speed
$pause=1*$delay;
$dot_pause=1*$delay;
$dash_pause=3*$delay;
$character_pause=3*$delay;
$word_pause=7*$delay;

print "\n\n";
print " Message >> ";
chomp($text=);
$original_text=$text;
@original_text=split //,$original_text;

$text=~s/ /\//ig;
$text=~s/\./.-.-.- /ig;
$text=~s/,/--..-- /ig;
$text=~s/\?/..-.. /ig;
$text=~s/a/.- /ig;
$text=~s/b/.--- /ig;
$text=~s/c/-.-. /ig;
$text=~s/d/-.. /ig;
$text=~s/e/. /ig;
$text=~s/f/..-. /ig;
$text=~s/g/--. /ig;
$text=~s/h/.... /ig;
$text=~s/i/.. /ig;
$text=~s/j/.--- /ig;
$text=~s/k/-.- /ig;
$text=~s/l/.-.. /ig;
$text=~s/m/-- /ig;
$text=~s/n/-. /ig;
$text=~s/o/--- /ig;
$text=~s/p/.--. /ig;
$text=~s/q/--.- /ig;
$text=~s/r/.-. /ig;
$text=~s/s/... /ig;
$text=~s/t/- /ig;
$text=~s/u/..- /ig;
$text=~s/v/...- /ig;
$text=~s/w/.-- /ig;
$text=~s/x/-..- /ig;
$text=~s/y/-.-- /ig;
$text=~s/z/--.. /ig;
$text=~s/1/.---- /ig;
$text=~s/2/..--- /ig;
$text=~s/3/...-- /ig;
$text=~s/4/....- /ig;
$text=~s/5/..... /ig;
$text=~s/6/-.... /ig;
$text=~s/7/--... /ig;
$text=~s/8/---.. /ig;
$text=~s/9/----. /ig;
$text=~s/0/----- /ig;

print " Sending >> $original_text[0]";
$count_text=1;
foreach (split //,$text) {
    if ($_ eq '.') {
        system("echo \"0\" > /sys/class/gpio/gpio$gpio/value");
        select undef,undef,undef,$pause;
        system("echo \"1\" > /sys/class/gpio/gpio$gpio/value");
        select undef,undef,undef,$dot_pause;
    }
    elsif ($_ eq '-') {
        system("echo \"0\" > /sys/class/gpio/gpio$gpio/value");
        select undef,undef,undef,$pause;
        system("echo \"1\" > /sys/class/gpio/gpio$gpio/value");
        select undef,undef,undef,$dash_pause;
    }
    elsif ($_ eq ' ') {
        system("echo \"0\" > /sys/class/gpio/gpio$gpio/value");
        select undef,undef,undef,$character_pause;
        print "$original_text[$count_text]";
        $count_text++;
    }
    elsif ($_ eq '/') {
        system("echo \"0\" > /sys/class/gpio/gpio$gpio/value");
        select undef,undef,undef,$word_pause;
        print "$original_text[$count_text]";
        $count_text++;
    }
    else { print "\nERROR: $_\n"; exit; }
}
print "\n";




หลักการของมันก็คือ รับตัวอักษรจากเราเข้า แล้วก็แปลงเป็น >> . - 'ช่องว่าง' / << แล้วก็ส่งค่า 0 กับ 1 ออกไปตามจังหวะ พอส่งค่า 1 ออกไปจากขา #24 ไฟ LED ก็จะติด แล้วก็ยังส่งค่าไปที่ขา #23 อีกด้วย(ซึ่งจะเป็นของฝั่งรับสัญญาณ ถ้าต้องการดูแค่ LED กระพริบเป็นสัญญาณ ขา #23 ก็ไม่ต้องใช้)
หรือถ้าเรา จะส่งรหัสมอสเอง อยากได้อารมณ์ของการนั่งกดปุ่มจริงๆ 5555 ก็กดจากสวิตได้เลย เพราะมีไฟจ่ายให้ทาง switch จากแหล่งจ่ายไฟ 3V ตลอดอยู่แล้ว



ทีนี้ มาดูทางฝั่งรับ รหัสมอส

#!/usr/bin/perl
$delay=0.1; #second
$timeout=60;  #loop for exit if didnt get any morse code
$text='';
$gpio=23;

print " Geting >> ";

do {
    open READ,"cat /sys/class/gpio/gpio$gpio/value |";
    $value=;
    close READ;
    select undef,undef,undef,$delay;
    $end=0;
} until ($value == 1);

while (1) {
    open READ,"cat /sys/class/gpio/gpio$gpio/value |";
    $value=;
    close READ;
    if ($value == 1) {
        print '1';
        select undef,undef,undef,$delay;
        $text.='1';
        $end=0;
    }
    else {
        print ',';
        select undef,undef,undef,$delay;
        $text.=',';
        ++$end;
    }
    if ($end > $timeout) {
        print "\n Morse >> ",analys($text);
        print "\n Text >> ",convert(analys($text));
        print "\n";
        exit;
    }
}


sub analys {
    my $text=$_[0];
#    $text=~s/1{3,}/-/g;            #For send speed = 0.125
#    $text=~s/1{1,2}/./g;           #For send speed = 0.125
#    $text=~s/,{11,}/  \/  /g;      #For send speed = 0.125
#    $text=~s/,{4,10}/  /g;         #For send speed = 0.125
#    $text=~s/,{1,3}//g;            #For send speed = 0.125
    $text=~s/1{4,}/-/g;            #For send speed = 0.25
    $text=~s/1{1,3}/./g;           #For send speed = 0.25
    $text=~s/,{11,}/  \/  /g;      #For send speed = 0.25
    $text=~s/,{5,10}/  /g;         #For send speed = 0.25
    $text=~s/,{1,4}//g;            #For send speed = 0.25
    return " ".$text." ";
}

sub convert {
    my $text=$_[0];
    $text=~s/ \.- /a/ig;
    $text=~s/ \.--- /b/ig;
    $text=~s/ -\.-\. /c/ig;
    $text=~s/ -\.\. /d/ig;
    $text=~s/ \. /e/ig;
    $text=~s/ \.\.-\. /f/ig;
    $text=~s/ --\. /g/ig;
    $text=~s/ \.\.\.\. /h/ig;
    $text=~s/ \.\. /i/ig;
    $text=~s/ \.--- /j/ig;
    $text=~s/ -\.- /k/ig;
    $text=~s/ \.-\.\. /l/ig;
    $text=~s/ -- /m/ig;
    $text=~s/ -\. /n/ig;
    $text=~s/ --- /o/ig;
    $text=~s/ \.--\. /p/ig;
    $text=~s/ --\.- /q/ig;
    $text=~s/ \.-\. /r/ig;
    $text=~s/ \.\.\. /s/ig;
    $text=~s/ - /t/ig;
    $text=~s/ \.\.- /u/ig;
    $text=~s/ \.\.\.- /v/ig;
    $text=~s/ \.-- /w/ig;
    $text=~s/ -\.\.- /x/ig;
    $text=~s/ -\.-- /y/ig;
    $text=~s/ --\.\. /z/ig;
    $text=~s/ \.---- /1/ig;
    $text=~s/ \.\.--- /2/ig;
    $text=~s/ \.\.\.-- /3/ig;
    $text=~s/ \.\.\.\.- /4/ig;
    $text=~s/ \.\.\.\.\. /5/ig;
    $text=~s/ -\.\.\.\. /6/ig;
    $text=~s/ --\.\.\. /7/ig;
    $text=~s/ ---\.\. /8/ig;
    $text=~s/ ----\. /9/ig;
    $text=~s/ ----- /0/ig;
    $text=~s/ \.-\.-\.- /./ig;
    $text=~s/ --\.\.-- /,/ig;
    $text=~s/ \.\.-\.\. /?/ig;
    $text=~s/ //ig;
    $text=~s/\// /ig;
    return $text;
}

หลักการทำงานคือ หลังจากรันสคริป มันจะรอเรื่อยๆ จนกว่าจะมีไฟจ่ายเข้าทาง #23 มันถึงจะเริ่มทำงาน โดยมันจะนับเวลาที่มีไฟจ่ายเข้า
  • ถ้าจ่ายเข้าสั้นๆ ก็นับเป็น . (dot)
  • ถ้าจ่ายเข้ายาวๆก็นับเป็น - (dash)
  • ถ้าเว้นว่างระยะหนึ่ง แล้วจ่ายไฟเข้าใหม่ ก็นับเป็นสิ้นๆสุดหนึ่งตัวอัก
  • ถ้าเว้นว่างยาวอีกหน่อย แล้วจ่ายไฟเข้าใหม่ ก็นับเป็นหนึ่งคำ
  • ถ้าเว้นว่างยาวเรื่อยๆ ก็ถือว่าสิ้นสุดการรับส่ง
พอรับมาเป็น . - 'ช่องว่าง' / แล้ว ก็เอามาแปลงเป็นตัวอักษรอีกทีนึง



จบละครับ หลักการง่ายๆ ตอนนี้ยังไม่รู้ว่าทำเสร็จ จะเอาประโยชน์อะไรดี ทำเอาเล่นๆสนุกๆก่อน ใครมีไอเดียวแจ่มๆ ก็มาแชร์กันบ้างนะครับ :P

Download morse-send.pl >> http://pastebin.com/Zi8WKn0L
Download morse-receive.pl >> http://pastebin.com/SidGeJtD

[Raspberry Pi][Perl] ควบคุม GPIO บน RaspberryPi ด้วย perl


อธิบายก่อนนะครับ ว่าอันที่จริง ไม่ใช่ใช้คำสั่ง perl ซักเท่าไหร่ แต่จะใช้ภาษา perl รันคำสั่ง linux ตอนใช้งาน GPIO บน raspberry pi อีกทีนึง ไม่งงนะ = = 55555

สำหรับสคริปนี้ ต้องรันด้วยสิทธิ์ root นะครับ (login ด้วย user root ก่อนรัน หรือใช้คำสั่ง sudo perl file.pl)

print "\n [+]----------------------------------------[+]";
print "\n  |    GPIO Control by using perl on bash    |";
print "\n  |      Test on Raspbian Wheezy [RPi]       |";
print "\n  |                                          |";
print "\n  |   Created by : AssazziN                  |";
print "\n  |   Version 1: 11 Mar 2013                 |";
print "\n [+]----------------------------------------[+]\n";

print "\n >> type h|help for help\n";
do {
    print " >> ";
    chomp($input=);
    if ($input eq 'h' or $input eq 'help') { help(); }

    elsif ($input=~/^export (\d{1,2})$/) {
        system("echo \"$1\" > /sys/class/gpio/export");
    }

    elsif ($input=~/^direction (\d{1,2}) (out|in)$/) {
        system("echo \"$2\" > /sys/class/gpio/gpio".$1."/direction");
    }

    elsif ($input=~/^value (\d{1,2}) (1|0)$/) {
        system("echo \"$2\" > /sys/class/gpio/gpio".$1."/value");
    }

    elsif ($input=~/^unexport (\d{1,2})$/) {
        system("echo \"$1\" > /sys/class/gpio/unexport");
    }

    elsif ($input=~/status/i) {
        @pin=();
        $pin=`find /sys/class/gpio/ gpio*`;
        while ($pin=~/sys\/class\/gpio\/gpio(\d{1,2})/g) { push(@pin,$1); }
        print " All pins that useabled : @pin\n";
    }

    elsif ($input eq 'q' or $input eq 'quit' or $input eq 'exit') {}
    else { print " $input : command not found\n"; }
} while ($input ne 'q' and $input ne 'quit' and $input ne 'exit');



sub help {
    print "\n ** This script requirement ROOT ***\n";
    print " > export [GPIO PIN]                 set gpio pin to useable\n";
    print " > direction [GPIO PIN] [out|in]     set gpio pin direction\n";
    print " > value [GPIO PIN] [1|0]            set gpio pin value\n";
    print " > unexport [GPIO PIN]               set gpio pin to unuseable\n";
    print " > status                            check status of all pin\n";
    print " > q quit exit                       exit script\n\n";
}


Pastebin: [Raspberry Pi] GPIO Control

ส่วนการใช้งานคำสั่งๆจริงๆ แบบไม่ผ่านสคริปนี้ ก็แกะจากโค้ดเอาละกัน ;p

คำสั่งเปิดใช้งานขา gpio ขาที่ #23 : sudo echo "23" > /sys/class/gpio/export
คำสั่งให้ขา gpio #23 เป็นตัว output : sudo echo "out" > /sys/class/gpio/gpio23/direction
คำสั่งให้ขา gpio #23 เป็นตัว input : sudo echo "in" > /sys/class/gpio/gpio23/direction
คำสั่งจ่ายไฟให้ขา gpio #23 : sudo echo "1" > /sys/class/gpio/gpio23/value
คำสั่งหยุดจ่ายไฟให้ขา gpio #23 : sudo echo "0" > /sys/class/gpio/gpio23/value
คำสั่งอ่านค่าสถานะของขา gpio #23 : cat /sys/class/gpio/gpio23/value
คำสั่งเลิกใช้งานขา gpio ขาที่ #23 : sudo echo "23" > /sys/class/gpio/unexport

วันจันทร์ที่ 11 มีนาคม พ.ศ. 2556

[Raspberry Pi] การเปิดใช้งาน ftp ด้วย vsftpd


สำหรับการเปิดใช้งาน ftp บน raspberry pi รู้สึกว่าจะมีให้เลือกใช้บริการหลายเจ้านะ แต่อันที่จริงคือ ผมรู้จักแต่ vsftpd 5555 ;p เห็นว่าตัวนี้ได้รับความนิยมเยอะด้วย ถึงมีปัญหาอะไร ก็จะมีเพื่อนช่วยแก้ให้เยอะด้วย จริงมั้ยหละ ? :)

เอาละครับ มาถึงเวลาลองกันละ
1. ตามสเตปเลย sudo apt-get install vsftpd
2. แล้วก็ไปตั้งค่ากันก่อน sudo nano /etc/vsftpd.conf
   2.1 แก้ตรงบรรทัด anonymous_enable=YES  ให้เป็น  anonymous_enable=NO (เพื่อป้องกันไม่ให้ใครก็ได้ล็อกอินเข้ามาแบบไม่ใส่ user ไม่ใส่ pass)
   2.2 แก้ตรง #local_enable=YES โดยเอาเครื่องหมาย # ออก (เพื่อให้ทุก user ใน /etc/passwd ล็อกอินเข้ามาได้)
   2.3  แก้ตรง #write_enable=YES โดยเอาเครื่องหมาย # ออก (เพื่อให้ user ที่ล็อกอินเข้ามา สามารถเขียนไฟล์ได้)
   (2.3) หรือบ้างคน อาจจะเพิ่มบรรทัด force_dot_files=YES เข้าไปบรรทัดสุดท้ายของไฟล์ด้วยก็ได้ เพื่อให้โปรแกรม ftp แสดงไฟล์ .htaccess
   2.4 ถ้าต้องการแก้ไข default ที่อยู่ของแต่ละ user สมมติว่า เรา ftp เข้าไปด้วย user ชื่อ www-data แล้วที่อยู่ปกติจะอยุ่ที่ /home/pi เราต้องการให้อยู่ที่ /var/www ให้แก้ที่ไฟล์ /etc/passwd หรือใช้คำสั่ง sudo -d /var/www www-data

3. ตั้งค่าเรียบร้อย ก็เปิดใช้งานเลย sudo service vsftpd restart
4. สามารถล็อกอินใช้งานจาก programs ftp ทั่วไปได้แล้ว

Ref : http://spalinux.com/2011/09/install_configure_vsftpd_ftp_server
http://www.voip4share.com/centos-the-community-enterprise-operating-system-f55/vsftpd-ftp-server-centos-t1162.html
http://www.itmanage.info/technology/linux/vsftp_config_read_only.html

วันอาทิตย์ที่ 10 มีนาคม พ.ศ. 2556

[Raspberry Pi] การใช้ vnc เพื่อ remote จากคอมไป raspberyy pi


สำหรับจะทำให้ Raspberry Pi เป็นเครื่อง vnc server ต้องติดตั้งตัว tightvncserver ก่อนครับ
sudo apt-get install tightvncserver  ต่อมาถ้าจะสร้าง 'หน้าต่าง' (ไม่รู้ว่าจะเรียกว่าอะไร 5555) ที่จะให้รีโมตเข้ามา กำหนดค่ายังงี้ครับ >> vncserver -geometry 1366x768 :N ตรง N อันนี้ใส่เป็นตัวเลขนะครับ เลขอะไรก็ได้ ประมาณว่า เป็นหมายเลขของ 'หน้าต่าง' ที่เราใช้งาน ปกติมันจะตั้งค่าละเอียดกว่านี้อยู่หรอก แต่หลักผมก็ใช้เท่านั้นแหละ อยากจะรู้การใช้งานแบบละเอียด ก็ vncserver --help เลย

สำหรับทางเครื่อง PC ,NB ที่จะ remote เข้าไป ถ้าเป็น windows ผมแนะนำโปรแกร ultra vnc viewer นะครับ จากที่ลองมาใช้งานได้ง่ายดี วิธีใช้งานก็แค่ ใส่หมายเลข ip ของ rPi ตามด้วย :N  เหมือนในภาพเลย


[Raspberry Pi] ลง nginx เพื่อทำ pi เป็น webserver


จากที่ลองหาความแตกต่างระหว่าง nginx กับ apache รู้สึกว่า nginx จะเป็นน้องใหม่มาแรง ทั้งความเร็วในการเข้าถึง จำนวน connection ที่รองรับ ขนาดความจำที่ใช้ ในหลายๆด้านจะดีกว่า apache ในบทความนี้ ผมเลยจะเขียนเกี่ยวกับการลง nginx กันนะครับ

อันดับแรกเลย ไม่พ้น sudo apt-get install nginx
หลังจากนั้นก็ sudo apt-get install php5-fpm php5-cli php5-curl php5-gd php5-mcrypt php5-mysql php5-cgi  เพื่อทำให้ php5 ทำงาน

1. ต่อมาใช้คำสั่ง sudo mkdir /var/www เพื่อสร้างโฟลเดอร์สำหรับเก็บไฟล์ต่างๆของ server
2. ค่า default ของ nginx โฟลเดอร์ของเวปจะอยู่ที่ /usr/share/nginx/www เพราะงั้น เราก็ต้องย้ายโฟล์เดอร์นั้น มาที่ /var/www ก่อน sudo cp /usr/share/nginx/www/*.* /var/www
3. ต่อมา ก็แก้ไขการตั้งค่าอีกนิดหน่อย sudo nano /etc/nginx/sites-available/default
4. แล้วก็เอา #(comment) ข้างหน้า listen   80; ## listen for ipv4; this line is default and implied ออก
6. ที่บรรทัด root /usr/share/nginx/www; ให้แก้เป็นที่อยู่โฟลเดอร์ webserver ของเรา -> root /var/www;
5. เอาเครื่องหมาย # ออกตั้งแต่ location ~ \.php$ {......}  ยกเว้นบรรทัด fastcgi_pass 127.0.0.1:9000;

6. กด Ctrl+x เพื่อออก -> กด y เพื่อบันทึก -> enter
7. sudo service nginx start
8. เข้าใช้งาน web server ของเราได้แล้วว :)

ต่อมา ติดตั้ง mysql กันเพิ่มอีกหน่อย
1. sudo apt-get install mysql-server mysql-client
2. ในระหว่างติดตั้ง มันก็จะให้ใส่ mysql password ก็ตั้งใส่กันไป


เสร็จแล้วก็มายัดสิทธิ์ ความเป็นเจ้าของให้กับ /var/www/ กันหน่อย ผมขอเลือก user ที่ชื่อ www-data ละกัน
sudo chown -R www-data:www-data /var/www

โอเชครับ เท่านี้ก็เสร็จไปครึ่งทางละ เดี๋ยวว่างๆไว้จะมาต่อกันกับการใช้งาน ftp และ phpmyadmin กัน

Ref : http://www.howtoforge.com/installing-nginx-with-php5-and-php-fpm-and-mysql-support-on-ubuntu-11.10
http://en.joscandreu.com/blog/install-nginx-on-raspberry-pi/

[Raspberry Pi] การเปลี่ยน layout keyboard


สำหรับตอนที่ลง OS Raspbian ใหม่ๆ เวลาที่พิม์ " @ # พวกนี้ อักขระมันจะไม่ใช่อย่างที่คีย์บอร์ดบ้านเราเห็นนะครับ เพราะ layout keyboard เดิม มันเป็นของ British เราก็ต้องมาแก้ให้มันเป็นของ US กันซะก่อน

sudo nano /etc/default/keyboard
แก้จาก gb ให้เป็น us
กด ctrl+x เพื่อออก -> กด y เพื่อบันทึก -> enter

แล้วก็ reboot ไปหนึ่งที ก็ใช้งานได้ละครับ

วันอาทิตย์ที่ 3 มีนาคม พ.ศ. 2556

มั่วๆกันต่อกับ Raspberry Pi [เล่นไฟล์ .mp3]~


    ก็เป็นภาคต่อจาก เริ่มต้นกับ Raspberry Pi :3 หลังจากที่เปิดใช้งานกันแล้ว เนื่องจากว่าผมยังไม่ได้ซื้อตัวรับไวรเลสก็เลยต่อสายแลนเอาครับ ต่อมาก็อัพเดทซอฟต์แวร์ต่างๆให้เป็น version ล่าสุดกันก่อน

  • sudo apt-get update
  • sudo apt-get upgrade
    ตามความเข้าใจผมก็คือว่าคำสั่งแรกจะเป็นเช็คว่ามีโปรแกรมตัวไหน ที่จะอัพเดทได้บ้าง แล้วค่อยมาใช้คำสั่ง apt-get upgrade เพื่อทำการอัพเดทมัน หลังจากอัพเดทเสร็จ ก็ไม่รู้ว่าจะใช้งานอะไรต่อดี ก็เลยลองฟังเพลงดูหน่อยละกัน แต่ไม่รู้จะเอาโปรแกรมไหนเปิด 5555+  ก็ค้นๆไป เจอกับกระทู้นี้
http://raspberry-pi-th.blogspot.com/2012/10/raspberry-pi-play-mp3-file.html ขอลองหน่อยละกัน
  • sudo apt-get install alsa-utils 
  • sudo apt-get install mpg321  
  • reboot
  • sudo modprobe snd-bcm2835 
  • sudo amixer cset numid=3 1  
    โอเค ลงโปรแกรมทุกอย่างเรียบร้อย ต่อไปมาลองฟังเพลงกันดู เสียงหูฟังที่แจ็ค 3.5mm ก็ใช้คำสั่ง cd เข้าไปที่เก็บไฟล์เพลง แล้วก็ mpg321 *.mp3 เพื่อเล่นทุกเพลง เท่านี้ก็เรียบร้อยแล้ว แล้วถ้าจะเพิ่มหรือลดเสียง ก็ใช้คำสั่ง alsamixer

    ครั้งต่อไป เดี๋ยวจะมาลองรีโมต RaspberryPi จากเครื่องอื่นกันดู ถ้าไม่ขี้เกียจเขียนนะ ;p


ขอแปะๆลิงค์เอาไว้หน่อยละกัน น่าสนใจๆ :