วันพุธที่ 31 ธันวาคม พ.ศ. 2557

มาทำการ์ดอวยพรปีใหม่กันเถอะ

มาทำการ์ดอวยพรปีใหม่กันเถอะ

         ช่วงนี้เป็นช่วงส่งท้ายปีเก่าต้อนรับปีใหม่ ซึ่งหลายคนคงมองการ์ดอวยพรปีใหม่ให้คนสำคัญ วันนี้ก็เลยมีไอเดียทำการ์ดอวยพรปีใหม่มาฝากกันครับ คร่าวๆ ก็จะเป็นการ์ดอวยพรปีใหม่ที่มีเสียงเพลงอวยพรปีใหม่เมื่อผู้รับทำการหยิบการ์ดอวยพรขึ้นมา (อาจจะมีไฟกระพริบด้วยก็ได้นะครับ)
        โดยจะใช้เทคนิคของ Capacitive Touch ในการเล่นไฟล์เสียง โดยจะทำงานเมื่อมีการสัมผัสโดนการ์ดอวยพรที่ติดตั้ง Arduino ที่สามารถเล่นไฟล์เสียงได้ ซึ่ง Arduino Pro Mini จะเล่นไฟล์ .wav ที่บันทึกไว้ใน SD Card ซึ่งไฟล์ .wav นี้จะเก็บข้อมูลที่เป็น Digital โดยมีชื่อว่า Pulse-Coded Modulation (PCM) หลายคนคงเคยคุ้นหูหรืออาจจะเคยรู้จักกับไฟล์ประเภทนี้มาบ้างแล้ว และเจ้า Arduino สามารถแปลง ข้อมูลที่เป็น Digital กลับไปเป็นสัญญาณ Analog (Digital to Analog Converter) หรือเรียกสั้นๆว่า DAC และส่งกลับไปยังลำโพงกลายเป็นเสียงได้ โดยใน Arduino Pro Mini มีวงจรประเภทนี้อยู่แล้วด้วย โดยมีชื่อว่า Pulse Width Modulation (PWM) แต่ด้วยข้อจำกัดที่ว่า Arduino Pro Mini เป็น MCU 8 bit และมีสัญญาณนาฬิกาแค่ 16 MHz จึงทำให้เล่นไฟล์เสียงที่มีคุณภาพแค่ 8 bit Mono ที่ sample rate ไม่เกิน 22 KHz
เท่านั้น
        หลังจากที่ได้เข้าใจหลักการเรียบร้อยแล้วเรามาทำการประกอบวงจรกันเลยครับ โดยจะต้องมีอุปกรณ์ดังต่อไปนี้ครับ (แบบประหยัดใช้อุปกรณ์น้อยที่สุด)

                 1. Arduino Pro Mini ATMega328
                 2. การ์ดอวยพร
                 3. สายไฟเชื่อมต่อวงจร
                 4.คลิปหนีบกระดาษ
                 5. Resistor    1 ~ 10 Mega ohm   1    ตัว (ค่ายิ่งเยอะขอบเขตของช่วงข้อมูลยิ่งกว้าง)
                 6. แบตเตอรี่  AAA 1.5V 2 ก้อน ( 3.0 V Arduino สามารถทำงานได้ )
                 7. ลำโพงขนาดเล็ก
                 8. SD Card Module for Arduino
                 9. SD Card Class 4 ฟอร์แมตแบบ Fat32 และใส่ไฟล์เสียง .wav @sample rate 22 KHz 8 bit Mono (เป็นเพลงหรือข้อความเสียงก็ตามแต่แนวความคิดของแต่ละคนเลยครับ)
          (แต่ถ้าใคร อยากให้ถูกต้องตามหลักจริงๆ รายการอุปกรณ์จะเยอะกว่านี้มาก ดูตามในเว็บอ้างอิงเลยครับ และแหล่งจ่ายไฟอาจจะใช้เป็นถ่าน 9V แล้วใช้ Regulator แปลงให้เป็น 5V กับ 3.3V หรือจะใช้ Arduino UNO แทนก็ได้นะครับเพราะมีวงจรแปลงไฟให้ในตัวแล้ว)

          จากนั้นก็ต่อวงจรตามรูปด้านล่างได้เลยครับ (วิธี upload program ดูจากบทความที่ผ่านมานะครับ)



         หลังจากนั้นก็ใส่โค๊ดให้กับ Arduino Pro Mini ของเรากัน ด้วยโค๊ดด้านล่าง

#include <SD.h>
#include <TMRpcm.h>
#include <CapacitiveSensor.h>

TMRpcm tmrpcm;

CapacitiveSensor cs_7_4 = CapacitiveSensor(7, 4);

int errLED = 3;
int chipSelect = 10;
long capVal = 0;

void setup() {
  Serial.begin(9600);
  pinMode(chipSelect, OUTPUT);
  pinMode(errLED, OUTPUT);
  if (!SD.begin(chipSelect, SPI_QUARTER_SPEED)) {
    // if SD Card error Red Led is on
    digitalWrite(errLED, HIGH);
    return;
  }
  // set speaker pin to pin 9
  tmrpcm.speakerPin = 9;
}

void loop(void) {
  // connect pin 7 and pin 4 for capacitive sensor
  capVal = cs_7_4.capacitiveSensor(10);
  if(!tmrpcm.isPlaying() && capVal > 100) {
    tmrpcm.stopPlayback();
    // your wave file name
    tmrpcm.play("/newyear.wav"); 
  }
}

         เมื่อจ่ายไฟให้กับ Arduino Pro Mini เรียบร้อยแล้วก็พร้อมที่จะเล่นเพลงได้แล้วครับ
ดังวีดีโอด้านล่าง



         ปีใหม่นี้ ก็ขอให้ท่านผู้อ่านลองคิดไอเดียร์ทำการ์ดอวยพรกันดูนะครับ อาจจะเป็นวาระอื่นๆ เช่น
วาเลนไทน์ วันเกิด หรืออาจจะทำเป็นวงจรเสียงอื่นๆ ก็ตามแต่จะประยุกต์ใช้กันนะครับ แต่คุณภาพเสียงว่ากันว่าเสียงดีกว่าวิทยุ AM นะครับ และถ้าหากใครมีโปรเจคที่น่าสนใจก็สามารถแชร์ความรู้กันทาง gtalk หรือทางเมลล์ได้นะครับ olekhanchai@gmail.com หรือสนใจอุปกรณ์สามารถเข้าสั่งซื้อได้ในเว็บ http://www.hobbyembshop.biz หรือที่ https://www.facebook.com/hobbyembedded  
          ขอให้มีความสุขในวันปีใหม่นะครับ เวอร์ชันนี้ยังมีปัญหาเรื่องค่าที่อ่านได้จาก Capacitive Sensor ยังไม่เสถียร ค่าค่อนข้างแกว่งมาก สื่อนำต่างกันค่าจะต่างกัน ต้องลองใช้สาย USB to Serial ดูค่าการเปลี่ยนแปลงและลองปรับค่า capacitiveSensor(samples rate)  และค่าเช็ค capVal กันดูนะครับ ไว้คราวหน้าจะปรับปรุงโค๊ดให้ดีขึ้น หรือถ้าใครมีวิธีแก้ไขปัญหาดังกล่าวก็แชร์กันได้นะครับ เจอกันปีหน้า สุขสันต์วันปีใหม่ครับ...
      

อ้างอิง   
http://playground.arduino.cc//Main/CapacitiveSensor?from=Main.CapSense
http://apcmag.com/arduino-project-5-digital-audio-player.htm

วันอังคารที่ 17 มิถุนายน พ.ศ. 2557

จับ Raspberry Pi มาเป็น PlayStation

        หลังจากที่นั่งดู Youtube เพลินๆ หันไปเจอที่โชว์ Emulator ของเครื่อง Playstation เห็นการ Render ภาพถือว่าลื่นไหลดีมาก ก็เลยอยากจะลองทำเล่นเองที่บ้านเองบ้าง  เนื่องจากสถาปัตยกรรมของ Raspberry Pi นั้นเป็น ARM และ PlayStation เป็น MIPS สองสถาปัตยกรรมนี้มีความแตกต่างกัน จึงต้องมีการทำเป็น Emulator ของ PS1 บน Rpi ซึ่งแน่นอนว่าความลื่นไหลสู้ PS1 ตัวจริงไม่ได้แน่นอน  แต่ถือว่าประสิทธิภาพการทำงานของ Emulator ตัวที่นำมาเสนอในวันนี้ถือว่าดีที่สุดแล้วซึ่ง Emulator
ตัวนั้นมีชื่อว่า PCSX_ReARMed และก่อนที่จะทำการติดตั้งเจ้า PCSX เรามาเตรียมอุปกรณ์ต่างๆ ให้ครบก่อนดังนี้ครับ

        1. ชุดเซ็ตของ Raspberry Pi 
     

        2. USB Joy Stick รุ่นไดก็ได้


        จากนั้นมาเริ่มทำการลงโปรแกรมกันเลย การลงโปรแกรมของ Raspbian ถือว่าทุกคนลงเป็นแล้วจะไม่ขอกล่าวถึงในบทความนี้นะครับ (สามารถกลับไปดูได้ในบทความของเดือน มกรา 2013)
        เมื่อทำการติดตั้ง Raspbian สามารถเชื่อมต่อกับ Network ได้แล้วเราจะทำการ clone project ของ PCSX_ReARMed ลงมาไว้ที่ home folder (~ default folder เมื่อเข้าสู่ Terminal) โดยใช้คำสั่ง 

        sudo git clone https://github.com/notaz/pcsx_rearmed

        ถ้าหากว่า clone project ได้สำเร็จจะเห็นข้อความดังรูปภาพที่แสดงด้านล่าง


        จากนั้นเข้าไปใน Folder ของ pcsx_rearmed โดยใช้คำสั่ง

        cd pcsx_rearmed

        ดังแสดงในรูปด้านล่าง


        พอถึงขั้นตอนนี้แล้ว เราจำเป็นจะต้องทำการกำหนดค่าเริ่มต้นและปรับปรุงโมดูลย่อยของ pcsx ให้อยู่ในสภาวะล่าสุดก่อน โดยใช้คำสั่ง

        sudo git submodule init && sudo git submodule update

        ถ้าหากทำการ Update ได้สมบูรณ์จะแสดงข้อความตามรูปด้านล่าง



       หลังจากนั้นเราจะทำการติดตั้ง Library ของ png และ sdl  ซึ่ง pcsx จำเป็นต้องใช้ในการ compile โดยใช้คำสั่งดังนี้

       sudo apt-get -y install libpng-dev libsdl1.2-dev

       หากทำการติดตั้ง Library ของทั้งสองอันเสร็จเรียบร้อยแล้วจะปรากฏข้อความตามรูปด้านล่าง


      จากนั้นทำการ config ค่า Environment ของโปรแกรมก่อนทำการ make โดยใช้คำสั่ง

       sudo ./configure 

       เมื่อ configure ค่า Environment เสร็จเรียบร้อยแล้วจะแสดงข้อความตามภาพด้านล่าง


        หลังจากนั้นก็ใช้คำสั่ง sudo make เพื่อทำการ compile โปรแกรมตามรูปด้านล่าง


        หากขั้นตอนทุกอย่างเสร็จเรียบร้อยก็จะได้ไฟล์ชื่อ pcsx ตามรูปด้านล่างครับ


        ก่อนที่จะทำการรันโปรแกรมจริงจำเป็นต้องมี bios ของ PS1 ให้กับ emu ของเราก่อน โดย download จาก http://www.4shared.com/zip/w4HkES5-ba/pcsx_rearmed_bios.html  แยกไฟล์ลงใน folder bios ของ flash drive ในที่นี้จะใช้วิธี copy ผ่าน flash drive ไปยัง raspberry pi โดยใช้คำสั่ง

        sudo cp -R /media/2A41-309B/bios/ ~/pcsx_rearmed/bios/

        (2A41-309B เป็นชื่อของ Flash Drive แต่ละเครื่องจะแตกต่างกัน หรือจะใช้วิธีการ copy ผ่านทางหน้าจอ File Manager ของ raspberry pi ก็ได้นะครับ)

        ท้ายสุดเรามาทำการลง Driver ของ Joy Stick กันก่อน เพื่อจะได้สัมผัสกับอารมณ์ของการเล่นเกม PS1 โดยการใช้คำสั่ง
 
        sudo apt-get install -y joystick


        เมื่อเสร็จขั้นตอนทุกอย่างแล้วเรามาทดสอบรันโปรแกรม pcsx ซึ่งในที่นี้ผมจะใช้เกม final fantasy 7 (copy ไฟล์แบบเดียวกับ bios แต่วางไว้ที่ home folder) มาลองให้ชมกัน ขั้นแรกเข้าโปรแกรมโดยการใช้คำสั่ง

      ./pcsx

       หากเข้าไปในโปรแกรมแล้วสามารถเปลี่ยนแปลงค่า config ได้จากตัว pcsx เองโดยจะสามารถเปลี่ยนอุปกรณ์ควบคุมให้เป็น JoyStick แทนได้ ตัวอย่างเกม final fantasy เมื่อทำการรันโปรแกรม pcsx
จะเป็นแสดงดัง video ด้านล่าง


      ลองทำเล่นดูนะครับ ภาพเต็มจอถือว่าพอรับได้ ในระดับของ PS1 หากว่าใครมี Emulator ของ PS2 ที่ใช้กับ RPI ที่ประสิทธิภาพใกล้เคียงกับ Emulator ตัวนี้ก็อย่าลืมแชร์กันบ้างนะครับ ถ้ามีปัญหาอะไรก็สามารถสอบถามผมได้ทาง olekhanchai@gmail.com หรือสนใจอุปกรณ์ต่างๆ สามารถเข้าไปเยี่ยมชมได้ที่ http://www.hobbyembshop.biz หรือทาง facebook ที่ https://www.faceboo.com/hobbyembedded
      สุดท้ายนี้ก็ขอให้สนุกกับการเล่นเกม PS1 นะครับ ไว้เจอกันโอกาสหน้าครับ

วันพุธที่ 16 เมษายน พ.ศ. 2557

มาทำ Home Automation กันเถอะ

        หลังจากห่างหายไปเป็นเวลาสามเดือน ก็ขอสวัสดีปีใหม่ไทยท่านผู้อ่านทุกๆ ท่านในช่วงสงกรานต์และขอกลับมาเขียนบล็อกให้ทุกท่านได้อ่านกันอีกครั้งนะครับ จากในหัวข้อที่กล่าวไว้ข้างต้นว่า
Home Automation คือการควบคุมอุปกรณ์ภายในบ้าน วันนี้ขอหยิบยกการทำอุปกรณ์ควบคุมภายในบ้านโดยใช้ Raspberry Pi และ Arduino มาให้ลองทำที่บ้านเล่นๆ กันนะครับ แต่ขอเตือนว่าโปรเจคนี้ค่อนข้างจะอันตราย หากไม่มีความรู้ด้านไฟฟ้าควรหาที่ปรึกษาด้านไฟฟ้าไว้นะครับ เพราะว่าโปรเจคนี้เล่นกับไฟฟ้าในบ้านที่มีแรงดัน 220 V หากไม่ระมัดระวังอาจเกิดอันตรายถึงชีวิตได้ โดยหากเกิดอะไรขึ้น ทางผู้เขียนจะไม่รับผิดชอบใดๆ เพราะถือว่าได้เตือนแล้ว  อาจจะฟังดูน่ากลัวไปหน่อย แต่คิดว่าคนที่สามารถทำวงจรนี้ได้คงมีความรู้ด้านไฟฟ้าอิเล็กทรอนิกส์พอตัวเหมือนกัน    เรามาเริ่มเตรียมอุปกรณ์กันเลยนะครับ รายการอุปกรณ์ที่จำเป็นจะต้องใช้ตามรายการด้านล่างเลยครับ

1.  Raspberry Pi Model B 512 MB      1          ตัว
2.  SD Card  4 GB ขึ้นไป      1          ตัว
3.  Arduino Pro Mini 16 MHz 5v      2          ตัว
4.  เต้าเสียบไฟฟ้าตัวเมีย      1          ตัว
5.  หม้อแปลง 5V 2A      1          ตัว
6.  Wireless RF Transmitter & Receiver 433 MHz      1       ชุด
7.  Optoisolator TLP560J      1       ตัว
8.  เสาอากาศ      2       อัน
9.  LED สีแดง      1       ตัว
10.  LED สีเขียว      1       ตัว
11.  PCB อเนกประสงค์      1       แผ่น
12.  Resistor 1.6 K Ohm      1       ตัว
13.  Resistor 3.3 K Ohm      1       ตัว

        เมื่อได้อุปกรณ์ครบทั้งหมดตามรายการเรียบร้อยแล้ว ขั้นตอนต่อไป เราจะแยกรายการอุปกรณ์
ดังกล่าวออกเป็นสองส่วนซึ่งรายละเอียดจะแยกอธิบายเป็นส่วนๆ ดังนี้ครับ

Wireless Plug

 

        ส่วนของ Wireless Plug จะเป็นส่วนของเต้าเสียบไฟฟ้าที่ใช้ Arduino Pro Mini ในการเปิดปิดเต้าเสียบเพื่อจ่ายไฟหรือหยุดการจ่ายไฟให้กับอุปกรณ์ที่เสียบกับเต้าเสียบนัันๆ โดยจะมี Opto เป็นตัวเปิดปิดแรงดันไฟฟ้าจากปลั๊กไฟไปยังเต้าเสียบไฟฟ้า ซึ่งจะควบคุมโดย Arduino Pro Mini ผ่านทาง
ขาที่ 7 อีกที โดยมีการรับคำสั่งจาก RF Receiver และมี LED แสดงสถานะการจ่ายไฟให้กับเต้าเสียบไฟฟ้า  ซึ่งการทำงานที่อธิบายข้างต้นสามารถต่อวงจรได้ตามรูปด้านล่างครับ


        หลังจากประกอบวงจรเสร็จเรียบร้อยแล้ว จำเป็นจะต้องมีการเขียนโปรแกรมให้กับ Arduino Pro Mini เพื่อที่จะให้วงจรสามารถสื่อสารกับ Wireless Server ได้ โดยโปรแกรมดังกล่าว จะขอหยิบยกเอาบทความของเดือน ตุลาคม 2013 มาดัดแปลง โดยโค๊ดดังกล่าวจะทำงานตามหลักการข้างต้น ส่วนการ Upload Program สามารถดูได้จากบทความของเดือน พฤศจิกายน 2013 ได้นะครับ ซึ่งรายละเอียดของโค๊ดตามข้อความข้างล่างเลยครับ

#define NETWORK_SIG_SIZE    3
#define VAL_SIZE                         2
#define CHECKSUM_SIZE          1
#define PACKET_SIZE      (NETWORK_SIG_SIZE + VAL_SIZE + CHECKSUM_SIZE)

#define NET_ADDR 5

const byte g_network_sig[NETWORK_SIG_SIZE] = {0x8F, 0xAA, NET_ADDR};  // Few bytes used to initiate a transfer
char c;
#define LED_ON        5
#define LED_OFF      6 
#define LELAY_ON   7
void setup()
{
  pinMode(LED_ON, OUTPUT);
  pinMode(LED_OFF, OUTPUT);
  pinMode(LELAY_ON, OUTPUT);
  digitalWrite(LED_ON, LOW);
  digitalWrite(LED_OFF, HIGH);
  digitalWrite(LELAY_ON, LOW);
  Serial.begin(1200);
}

void loop()
{
  Serial.write(readUInt(true));
}

void plugOn()
{
  digitalWrite(LED_ON, HIGH);
  digitalWrite(LELAY_ON, HIGH);
  digitalWrite(LED_OFF, LOW);
}

void plugOff()
{
  digitalWrite(LED_ON, LOW);
  digitalWrite(LELAY_ON, LOW);
  digitalWrite(LED_OFF, HIGH);
}

unsigned int readUInt(bool wait)
{
  int pos = 0;          // Position in the network signature
  unsigned int val;     // Value of the unsigned int
  byte c = 0;           // Current byte

  if((Serial.available() < PACKET_SIZE) && (wait == false))
  {
    return 0xFFFF;
  }

  while(pos < NETWORK_SIG_SIZE)
  {
    while(Serial.available() == 0); // Wait until something is avalible
    c = Serial.read();

    if (c == g_network_sig[pos])
    {
      if (pos == NETWORK_SIG_SIZE-1)
      {
        byte checksum;

        while(Serial.available() < VAL_SIZE + CHECKSUM_SIZE); // Wait until something is avalible
        val      =  Serial.read();
        val      += ((unsigned int)Serial.read())*256;
        checksum =  Serial.read();
      
        if (checksum != ((val/256) ^ (val&0xFF)))
        {
          // Checksum failed
          pos = -1;
        }
      }
      ++pos;
    }
    else if (c == g_network_sig[0])
    {
      pos = 1;
    }
    else
    {
      pos = 0;
      if (!wait)
      {
        return 0xFFFF;
      }
    }
  }
  return val;
}

        เท่านี้เราก็ได้ Wireless Plug ที่พร้อมใช้งานได้แล้วครับ หากนำวงจรข้างต้นมาประกอบลงเต้าเสียบไฟฟ้า จะได้หน้าตาของ Wireless Plug ประมาณนี้ครับ

 

Wireless RPI Server

 

        ส่วนของ Wireless RPI Server นี้จะเป็นศูนย์สั่งการให้กับเต้าเสียบต่างๆ ที่เชื่อมต่อกับ Server ด้วย Wireless RF Module โดยจะทำหน้าที่ในการรับคำสั่งผ่านเว็บ Interface ซึ่งอาจจะใช้ Android, IPhone หรือ Notebook ในการเข้าหน้าเว็บดังกล่าวเพื่อควบคุมก็แล้วแต่ความสะดวกของแต่ละท่านนะครับ
ส่วนของ Server นี้จะมีความซับซ้อนในการติดตั้งนิดนึง โดยสามารถทำตามขั้นตอนต่อไปนี้ได้เลยครับ

        Raspbian Setup

        ขั้นตอนการติดตั้ง Raspbian ขอละไว้ในฐานที่เข้าใจนะครับ ซึ่งสามารถกลับไปดูบทความแรกของ
ปี 2013 ในการติดตั้งได้ หน้าตาของการติดตั้งอาจจะเปลี่ยนแปลงไปตามการอัพเดทของแต่ละเวอร์ชันของ Raspbian แต่ขั้นตอนยังเหมือนเดิมครับ

        LAMP Setup 

        ขั้นตอนการติดตั้ง LAMP ก็ขอละไว้ในฐานที่เข้าใจด้วยเช่นกัน ซึ่งสามารถย้อนกลับไปดูบทความของเดือนมิถุนายนของปี 2013 ได้ครับ

        Serial Port (UART) Setup 

        Raspberry Pi จะทำการส่งข้อมูลการแสดงผลออกทาง Serial Port ตั้งแต่เริ่มทำงาน ด้วย getty
ดังนั้นหากเราจะใช้งาน Serial Port ดังกล่าว เราจะต้องทำการตัดการทำงานของ getty ทิ้งไป โดยทำตามขั้นตอนดังนี้

        1. ทำการแก้ไขไฟล์ /etc/inittab โดยให้ค้นหาข้อความดังนี้

                T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100

        และใส่ comment ให้กับบรรทัดดังกล่าว เพื่อปิดการทำงานของ getty ดังนี้

                #T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100

        2. แก้ไขไฟล์ /boot/cmdline.txt โดยหาข้อความดังนี้

                console=ttyAMA0, 115200 kgdboc=ttyAMA0, 115200 

        จากนั้นให้ลบข้อความข้างต้นทิ้งไป เพื่อไม่ให้ Raspberry Pi ส่งการแสดงผลออกทาง Serial Port

        3. ติดตั้ง Py-Serial ให้กับ Raspbian ซึ่งเป็น Library ของ Python ที่ใช้ติดต่อ Port Serial  นั่นเอง โดยใช้คำสั่งดังนี้

                sudo apt-get install python-serial

        4. เปิดให้ Browser สามารถเข้าใช้งานใช้งาน Serial Port โดยการเปิดสิทธิ์การเข้าถึงของ Serial ไว้ที่ Startup เพื่อให้มีการกำหนดสิทธิ์ทุกครั้งเมื่อมีการบูทระบบใหม่ ซึ่งจะต้องสร้างไฟล์ชื่อ freeAMA0 ไว้ที่ /etc/init.d/ โดยมีเนื้อหาดังนี้

                sudo chmod 777 /dev/ttyAMA0

        ซึ่งเมื่อสร้างไฟล์ freeAMA0 ที่มีเนื้อหาข้างบนเสร็จเรียบร้อยแล้ว ให้สั่งคำสั่ง

                sudo update-rc.d freeAMA0 defaults

        เพื่อสั่งให้ freeAMA0 ทำการกำหนดสิทธิ์การเข้าถึงอัตโนมัติเมื่อมีการบูท Raspberry ทุกครั้ง

        เมื่อเสร็จขั้นตอนข้างต้นเรียบร้อยแล้ว ก็ถือว่าในส่วนของการเตรียม Serial Port ของ Raspberry Pi เสร็จสมบูรณ์
        ก่อนที่จะทำการต่อวงจรให้ Arduino Pro Mini กับ Raspberry Pi เพื่อให้สื่อสารกันนั้น ก็มาทำการเขียนโปรแกรมให้กับ Arduino Pro Mini ฝั่ง Transmitter และ Upload Program ให้กับ Arduino Pro Mini กันก่อน โดยปรแกรมจะเขียนตามโค๊ดด้านล่างเลยครับ

#include <SoftwareSerial.h>
#define NET_ADDR                   5
#define NETWORK_SIG_SIZE 3
#define VAL_SIZE                      2

SoftwareSerial swSerial(9, 10);
const byte g_network_sig[NETWORK_SIG_SIZE] = {0x8F, 0xAA, NET_ADDR};
// Few bytes used to initiate a transfer
int i = 0;
boolean turnon = false;

void setup()
{
  swSerial.begin(9600);
  Serial.begin(1200);
}

void loop()
{
  if (swSerial.available())
  {
    char buf = swSerial.read();
    if (buf == 48) {       // check for number 0
      turnon = false;
    }
    if (buf == 49) {      // check for number 1
      turnon = true;
    }
  }
  if (turnon)
  {
    writeUInt('1');
  }
  else
  {
    writeUInt('0');
  }
}

void writeUInt(unsigned int val)
{
  byte checksum = (val/256) ^ (val&0xFF);
  Serial.write(0xF0);  // This gets reciever in sync with transmitter
  Serial.write(g_network_sig, NETWORK_SIG_SIZE);
  Serial.write((byte*)&val, VAL_SIZE);
  Serial.write(checksum); //CHECKSUM_SIZE
}

        หลังจากนั้นเราก็จะมาเตรียมการในส่วนของวงจรฝั่ง Wireless RPI Server ที่สื่อสารกันระหว่าง Raspberry Pi กับ Arduino กันบ้าง  โดยต่อวงจรตามรูปเลยครับ

   
        ในส่วนของ Serial Port นั้นจะใช้ส่วนของ GPIO ขาที่ 8 และ ขาที่ 10  ในการสื่อสารระหว่าง Raspberry Pi และ Arduino Pro Mini  ขา 9 และ ขา 10 ซึ่งในที่นี้คือ Software Serial โดย Port Serial จริงของ Arduino นั้นจะใช้ในการสื่อสารกับ Wireless Module จึงต้องสื่อสารกับ Raspberry Pi โดยใช้ Port Serial เสมือนในการติดต่อสื่อสาร (ซึ่งก็คือ Software Serial นั่นเอง) และเนื่องจาก Raspberry Pi วงจรสื่อสารภายในเป็น 3.3 V ส่วน Arduino Pro Mini นั้นจะเป็น 5 V เพื่อป้องกันความเสียหายในการติดต่อสื่อสารระหว่างทั้งสองบอร์ดจึงต้องมี Resistor สองตัวที่ต่อวงจรเป็น Voltage Divider เพื่อที่จะทำการลดแรงดันจาก Arduino Pro Mini ให้กับ Raspberry Pi ไว้ด้วย

        จากวงจรข้างต้นเราสามารถนำมาประกอบเป็นวงจร Wireless RPI Server โดยติดตั้ง Raspberry Pi กับ RF Module Socket ได้ตามรูปด้านล่างครับ

 

        Control Web Page

 

        มาถึงขั้นตอนสุดท้ายซึ่งจะเป็นหน้าเว็บที่ใช้ติดต่อกันระหว่างผู้ใช้งานและ Server โดยจะเป็นการสั่งให้ Serial Port ทำการเปิดหรือปิด Wireless Plug ที่ปลายทาง ซึ่งหน้าเว็บดังกล่าวสามารถเขียนเป็นไฟล์แยกกันได้ดังนี้

สร้างไฟล์  index.php โดยมีเนื้อหาดังนี้

        ก่อนที่จะทำการสร้างไฟล์ index ให้ดาวน์โหลด JQuery มาลงไว้ที่ /var/www เสียก่อน โดยสามารถดาวน์โหลดได้จาก http://code.jquery.com/jquery-2.1.0.min.js จากนั้นค่อนสร้างไฟล์ index.php ไว้ที่ folder เดียวกัน ซึ่งมีเนื้อหาไฟล์ดังนี้

<html>
<head>
<title> Enable / Disable Wireless Plug Demo </title>
<script src="jquery-2.1.0.min.js"></script>
<script type="text/javascript">
function onPlug(){
        $.ajax("on.php");
}
function offPlug(){
        $.ajax("off.php");
}
</script>
</head>
<body>
        <button onclick="onPlug();"> ON </button>
        <button onclick="offPlug();"> OFF </button>
</body>
</html>

สร้างไฟล์ on.php ที่มีเนื้อตามข้อความด้านล่าง

<?
echo exec("python serialTest.py 1 2>&1");
?>

สร้างไฟล์ off.php ที่มีเนื้อตามข้อความด้านล่าง

<?
echo exec("python serialTest.py 0 2>&1");
?>

และสุดท้ายสร้างไฟล์ serialTest.py ซึ่งเป็นไฟล์ส่งข้อมูลการปิดเปิดของ Wireless Plug
โดยมีเนื้อหาดังนี้

import serial
import sys

ser = serial.Serial('/dev/ttyAMA0', 9600, timeout=1)
ser.open()

print("'" + sys.argv[1] + "'")
ser.write("'" + sys.argv[1] + "'")
จากนั้นสามารถลองทดสอบโปรแกรมได้เลย โดยใช้ Web Browser เข้าไปที่หน้า index.php ซึ่งในที่นี้จะใช้มือถือ Android ในการทดสอบ  โดยหน้าตาเว็บใน Android จะเป็นหน้าตาประมาณนี้ครับ


เราลองมาทดสอบการใช้งาน Home Automation ของเรากันครับ


         สุดท้ายนี้ก็หวังเป็นอย่างยิ่งว่า บทความนี้จะเป็นจุดประกายให้กับหลายๆ คนที่กำลังคิดจะทำ Home Automation เองในบ้าน ซึ่งอาจจะสร้าง Wireless Plug ขึ้นมาเพิ่มอีกหลายๆ ตัวก็ย่อมทำได้ โดยเปลี่ยนแปลงโค๊ดนิดหน่อย หรือจะเปลี่ยนการสื่อสารจาก RF ให้เป็น Wireless Module อื่นๆ เช่น XBee, Wifi Module หรือ Bluetooh หรืออุปกรณ์ไร้สายอื่นๆ ที่มีความแม่นยำมากกว่านี้ หรือเก็บสถานะ
Wireless Plug ไว้เพื่อแสดงสถานะบนหน้าเว็บว่ากำลังอยู่ในสถานะว่ากำลังเปิดหรือปิดอยู่ ก็สามารถทำได้ครับ ในตอนนี้เชื่อว่าหลายๆ คนคงเกิดไอเดียต่างๆ มากมายขึ้นมาแล้ว ถ้าหากใครมีโปรเจคที่น่าสนใจก็สามารถ แชร์ความรู้กันทาง gtalk หรือทางเมลล์ได้นะครับ olekhanchai@gmail.com หรือสนใจอุปกรณ์สามารถเข้าสั่งซื้อได้ในเว็บ http://www.hobbyembshop.biz หรือสินค้าโปรโมชั่นที่ https://www.facebook.com/hobbyembedded
        ขอให้สนุกกับการใช้งาน Wireless Plug นะครับ เจอกันคราวหน้าครับ...


อ้างอิง  http://blog.oscarliang.net/raspberry-pi-and-arduino-connected-serial-gpio/