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

RetroBSD บน Max32

RetroBSD บน Max32


        ถ้าจะกล่าวถึง Open-Source Electronics Board ก็คงจะมีหลายตัวเหมือนกันที่น่าเอามาลองเล่น
ลองศึกษา ก่อนที่จะปีใหม่กันจึงอยากขอแนะนำระบบปฏิบัติการและ MCU อีกหนึ่งตัวที่น่าลองเล่นอยู่ไม่น้อย ในบทความนี้จึงขอหยิบยก Board Max32 มาลองเล่นกัน ซึ่งในที่นี้ Board ดังกล่าวจะใช้  PIC32 เบอร์ PIC32MX795 มาเป็นตัวประมวลผล ถ้าเทียบราคากับประสิทธิภาพแล้ว
อาจจะสู้ Raspberry Pi ไม่ได้ แต่ผู้อ่านสามารถทำใช้เองได้โดยมีอุปกรณ์เพียงไม่กี่ชิ้นโดยสามารถดูได้จาก Schematic ที่อยู่ในเว็บซึ่งหาได้ไม่ยาก

        ปกติแล้ว MCU ตระกูล PIC โปรแกรมเมอร์ส่วนมากจะใช้ MPLAB ของ Microchip เขียนโปรแกรมแล้วทำการ Compile ให้เป็น .HEX จากนั้นก็ทำการเขียนลงในหน่วยความจำของ MCU เบอร์นั้นๆ

        ในบทความนี้ผมจะเปลี่ยนแนวลงระบบปฏิบัติการลงใน Max32 ดูบ้าง แต่อย่างไรก็ตามต้องทำการ Flash เพื่อติดตั้ง Hex File ที่เป็น Bootloader ของระบบปฏิบัติการนี้เช่นกัน โดยระบบปฏิบัติการตัวนี้
มีชื่อว่าRetroBSD ครับ

        ก่อนที่จะมาลองเล่นกันต้องเตรียมอุปกรณ์ดังต่อไปนี้ครับ

        1. (chipKIT) Max32 Board ซึ่งมีหน้าตาประมาณนี้ครับ


        2. Arduino Ethernet Shield หน้าตาก็ประมาณนี้ครับ


        3. Micro SD Card ขนาด 1 GB ขึ้นไป

        บอร์ด Max32 ถูกออกแบบมาให้สามารถใช้กับอุปกรณ์ของ Arduino ได้ ดังนั้นสามารถประกอบ Max32 เข้ากับ Ethernet Shield ของ Arduino ได้เลย ซึ่งประกอบเสร็จเรียบร้อยแล้ว จะมีหน้าตาประมาณนี้ครับ


        จากนั้นมาหาไฟเลี้ยงให้กับ Max32 กัน โดยอาจจะใช้เป็น MicroUSB ต่อพ่วงกับคอมพิวเตอร์หรือจะใช้ DC Adapter ประมาณ 5 - 15 V 500 mA ขึ้นไปก็แล้วแต่สะดวกแล้วกันนะครับ
(ในที่นี้ขอใช้เป็น MicroUSB)
       
        เมื่อได้อุปกรณ์ครบทั้งหมดเรียบร้อยแล้ว ประกอบกันเสร็จจะได้หน้าตาประมาณนี้ครับ

        คราวนี้เราจะมาทำการลงระบบปฏิบัติการให้กับ Max32 กัน โดยจะแยกออกเป็น 3 ระบบปฏิบัติการเช่นเคย ดังนี้ครับ

สำหรับระบบปฏิบัติการ Windows

        หลังจากประกอบบอร์ด Max32 กับ Ethernet Shield เรียบร้อยแล้ว ก็ใช้สาย Mini USB ต่อเข้ากับบอร์ดเพื่อเป็นไฟเลี้ยง แต่ Computer ของเรายังไม่รู้จักกับ Max32 ซึ่งถ้าหากว่าเข้าไปที่
Device Manager ก็จะแสดงรูปดังนี้ครับ


         เราจะทำการติดตั้ง Driver ให้กับ Max32 นี้โดยการโหลด Driver
จากเว็บ http://www.ftdichip.com/Drivers/VCP.htm  ในที่นี้ผู้เขียนใช้ Windows 7 (32 bit) จึงดาวน์โหลด version 2.08.28 จากนั้นให้ทำการแยกไฟล์ zip ออกมา แล้วคลิกที่ Update Driver


       จากนั้นเลือก Browse my computer for device software ตามที่แสดงในรูปครับ


        จากนั้นจะปรากฏหน้าต่างค้นหา Driver ให้คลิกที่ Browse แล้วเลือก Folder ที่แยกไฟล์ไว้ในข้างต้น


       คลิกที่ปุ่ม Next จากนั้นระบบจะทำการติดตั้ง Driver ของ FTDI ที่เหมาะสมที่สุดให้ จากนั้นคลิก Close เพื่อปิดหน้าต่าง



       จากนั้นจะขึ้นอุปกรณ์ใหม่ซึ่งเป็น USB Serial Port แทน ในเครื่องของผู้เขียนจะเป็น USB Serial Port (COM7) ดังที่แสดงในรูปครับ


         เมื่อติดต่อกับ Max32 ได้แล้ว ต่อไปเราจะทำการติดตั้ง Bootloader ให้กับ Max32 กัน เพื่อเป็นตัว Loader ให้กับระบบปฏิบัติการ RetroBSD โดยดาวน์โหลดไฟล์ตามลิงค์นี้เลยครับ

http://code.google.com/p/retrobsd/downloads/detail?name=retrobsd-max32-r511.zip

        หลังจากได้ไฟล์มาเรียบร้อยแล้วให้ทำการแยกไฟล์ลงใน Folder ที่ต้องการ ในที่นี้ขอลงไว้ที่หน้าจอ Desktop แล้วก็พักเอาไว้ก่อน

         จากนั้นเราจะมาติดตั้งโปรแกรมที่ใช้ในการ Flash Hex File ลงใน Max32 กันต่อ ซึ่งโปรแกรมนี้มีชื่อว่า Avrdude โดยสามารถดาวโหลดได้ที่ http://sourceforge.net/projects/winavr/?source=dlp
และทำการติดตั้งในเครื่องโดย double click ที่โปรแกรมที่โหลดมา แล้วทำตามขั้นตอนดังนี้เลยครับ

          1. เลือกภาษาให้กับตัวโปรแกรมแล้วก็คลิก OK
          2. จะปรากฏหน้าจอ Welcome ดังรูปด้านล่าง ให้คลิก Next เพื่อดำเนินการต่อไป


            3. จากนั้นจะแสดงหน้า License Agreement ให้คลิก I Agree เพื่อรับทราบลิขสิทธิ์


            4. เมื่อยอมรับเสร็จแล้วจะขึ้นหน้าจอเพื่อให้เลือก Location ที่จะลงโปรแกรมดังรูป


            5. ในที่นี้จะลงไว้ที่ C:\WinAVR จากนั้นคลิก Next เพื่อเข้าสู่หน้าจอเลือกส่วนประกอบโปรแกรม


            6. จากนั้นก็ทำการกดปุ่ม Install เพื่อติดตั้งโปรแกรม จากนั้นระบบจะทำการติดตั้งสำเร็จ โดยจะมีหน้าจอดังรูป จากนั้นให้กด Finish เพื่อปิดหน้าต่างการติดตั้งไป


        เมื่อทำการติดตั้งเสร็จเรียบร้อยแล้ว WinAVR จะยังไม่สามารถใช้งานกับ PIC32 ได้เลย เพราะว่าโปรแกรมได้ออกแบบมาเพื่อใช้งานกับ MCU ตระกูล AVR โดยเฉพาะ จึงต้องมีไฟล์ avrdude.conf ที่สามารถใช้งานกับ PIC32 ได้โดยทำการ Download ไฟล์ดังกล่าวได้จาก link ด้านล่าง

http://pic32-examples.googlecode.com/svn-history/r33/trunk/showroom/retro_bsd/avrdude/avrdude.conf 

        ให้บันทึกไฟล์ avrdude.conf นี้ไว้ใน C:\WinAVR\bin\avrdude.conf โดยทำการแทนที่ไฟล์เดิม

        หลังจากเสร็จขั้นตอนดังกล่าว จากนั้นจะเริ่มการ Flash Bootloader ให้กับ Max32 โดยใช้คำสั่ง avrdude ผ่าน Console มีขั้นตอนดังนี้ครับ

        เข้าไปยัง Folder ที่แยกไฟล์ไว้ด้วยคำสั่ง


        จากนั้นใช้คำสั่ง avrdude ทำการ Flash ไฟล์ unix.hex ลงใน Max32 โดยพิมพ์คำสั่งดังนี้



        เมื่อเสร็จขั้นตอนการ Flash Bootloader จะแสดงหน้าจอดังนี้


        เมื่อเสร็จขั้นตอน Bootloader เรียบร้อยแล้ว ต่อไปจะทำการติดตั้ง File System ให้กับ Max32 กัน
ซึ่งในที่นี้อาจจะใช้ SD Card ระดับเป็น MB ก็ได้ครับ เพราะว่าไฟล์มีนิดเดียว ในที่นี้ขอใช้ 8GB
โดยทำตามขั้นตอนดังนี้เลยครับ

        เปิดโปรแกรม Win32Diskimager (วิธีการติดตั้งดูในบทความแรก) จากนั้นเลือกโฟล์เดอร์สีน้ำเงิน เพื่อทำการ Browse ไฟล์ filesys.img ดังแสดงในรูป


         จากนั้นคลิกที่ Write เพื่อทำการเขียนไฟล์ลงใน SD Card ซึ่งจะฟ้องข้อความขี้นมาดังนี้


          คลิกที่ Yes จากนั้นระบบจะทำการ format และสามารถลงได้ และเมื่อข้อความเสร็จแล้วจะมีหน้าตาแบบนี้ช่วยได้หรือเปล่า
          เมื่อเสร็จขั้นตอนดังกล่าวก็นำ SD Card ไปเสียบในช่อง Ethernet จากนั้นก็เสียบ USB เพื่อจ่ายไฟให้กับ Max32 และสื่อสารกับ Max32 ด้วย Putty โดยสามารถดาวน์โหลดที่ http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html
จากนั้นรันโปรแกรม Putty เลือกการสื่อสารผ่านทาง Serial COM7 และตั้ง Speed ที่ 11520 (buad rate) ตามรูปด้านล่างเลยครับ


         หลังจาก Connect ผ่านทาง Serial Port ระบบปฏิบัติการก็จะทำงาน โดยใส่ Login User เป็น root รหัสผ่านให้ enter ผ่านไป จากนั้นก็จะได้หน้าตาประมาณนี้ครับ


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

อ้างอิง

http://www.ladyada.net/learn/avr/setup-win.html
http://retrobsd.org


วันศุกร์ที่ 29 พฤศจิกายน พ.ศ. 2556

มาทำความรู้จักกับ Arduino Pro Mini กัน

มาทำความรู้จักกับ Arduino Pro Mini กัน

        หลังจากที่เคย ศึกษา Arduino UNO R3 และ Shield ของ UNO ไปแล้ว วันนี้เราจะมารู้จักกับ Arduino กันอีกตัว ซึ่งเจ้า Arduino Pro Mini นี้ก็จะมีหลายรุ่นแยกออกมา โดยแต่ละรุ่นจะใช้ MCU
ต่างกัน ไฟเลี้ยงต่างกัน และสัญญาณนาฬิกาต่างกันด้วย ซึ่งจะมีรุ่นที่ใช้ MCU เบอร์ ATmega168
และ ATmega328, ไฟเลี้ยง 3.3V และ 5V สัญญาณนาฬิกา 16Mhz และ 8Mhz ราคาและประสิทธิภาพของแต่ละรุ่นจะขึ้นอยู่กับ องค์ประกอบที่กล่าวมาข้างต้น
        ในที่นี้เราจะมาศึกษา Arduino Pro Mini ATmega328 5V 16Mhz กัน โดยจะมีรูปร่างหน้าตาประมาณนี้ครับ
        แต่เจ้าตัว Pro Mini นี้ไม่มี USB Port ที่จะสามารถทำการ Upload โปรแกรมจาก Arduino IDE ได้โดยตรง ดังนั้นจึงต้องมีสาย TTL to USB เพื่อที่ใช้สำหรับการติดต่อกับ Board ตัวนี้กัน โดยจะมีรูปร่างหน้าตาประมาณนี้ครับ



        เจ้าสายตัวนี้จะทำหน้าที่แปลงสาย USB ให้กลายเป็นสายสัญญาณ 6 เส้น ซึ่งจะประกอบไปด้วย GND, CTS, VCC, TX, RX และ DTR  โดยขา VCC จะมีแรงดัน 5V
        ก่อนที่เราจะทำการเชื่อมต่อสายระหว่าง TTL to USB กับ Arduino Pro Mini  เราจะมารู้จักกับ
รายละเอียดต่างๆของเจ้า Arduino ตัวที่เราจะเอามาเล่นกัน ซึ่งจะมีรายละเอียดดังต่อไปนี้ครับ

Features:
  • ATmega328 running at 16MHz with external resonator (0.5% tolerance)
  • 0.8mm Thin PCB
  • USB connection off board
  • Supports auto-reset
  • 5V regulator
  • Max 150mA output
  • Over current protected
  • Weighs less than 2 grams!
  • DC input 5V up to 12V
  • On board Power and Status LEDs
  • Analog Pins: 8
  • Digital I/Os: 14
        อ้างอิงจาก https://www.sparkfun.com/products/11113

        หลังจากที่ได้ทราบรายละเอียดคร่าวๆ ของบอร์ดนี้แล้ว เราจะมาทำการเชื่อมต่อสาย TTLtoUSB กับ Arduino กัน โดยจะต้องเตรียมอุปกรณ์ดังนี้ครับ
1.  Arduino Pro Mini 328 5v 16MHz      1          ตัว
2.  สาย TTLtoUSB      1          เส้น
3.  Resistor  10K Ohm      1          ตัว
4. Capacitor  4.7uF 16V      1          ตัว

         ก่อนที่เราจะต่อวงจร เรามาทำการติดตั้ง Driver ของ TTLtoUSB กันก่อนดีกว่าครับ โดยสามารถ Download Driver ของสายได้ที่
http://support.lenovo.com/en_US/downloads/detail.page?DocID=DS034089
ซึ่งในที่นี้สายที่ผู้เขียนได้เอามาทดลองใช้ Chip ของ PL2303 ครับ
จากนั้น เราทำการต่ออุปกรณ์ในรายการตามรูปด้านล่างได้เลยครับ


          เมื่อต่อวงจรกันเสร็จเรียบร้อยแล้ว เราก็มาทดสอบโดยใช้ Arduino IDE ซึ่งผมจะไม่ขออธิบายรายละเอียดการติดตั้งนะครับ (สามารถย้อนกลับไปอ่านบทความก่อนหน้านี้ได้)
ส่วนของ Board ให้เลือกเป็น Arduino Pro or Pro Mini


         ในส่วนของ Port ให้เลือก Port Com ของสายที่ลง Driver ไว้


           หลังจากนั้นเรามาลองทดสอบ Burn Program กันโดยเลือกไฟล์ตัวอย่างโปรแกรม จาก Example => Basic => Blink โดย Pin 13 ของ Arduino Pro Mini จะต่อกับ LED อยู่แล้ว


          IDE จะแสดงหน้าจอของ Code Arduino จากนั้นก็ทำการ Upload โปรแกรมลง Arduino Pro Mini โดยตัวอย่างการ Burn Arduino Pro Mini แบบไม่มี Pin จะเป็นดังนี้



          Arduino Pro Mini ถือว่าเป็น Arduino เบอร์เล็กที่ราคาถูก และมีขนาดค่อนข้างเล็ก จึงเหมาะกับการประยุกต์ใช้งานชิ้นเล็กๆ ที่ต้องการการเชื่อมต่อไม่มาก และพื้นที่วางค่อนข้างจำกัด ไว้คราวหน้าเราจะเอาเจ้า Pro Mini นี้มาทำโปรเจคกันครับ

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




วันจันทร์ที่ 28 ตุลาคม พ.ศ. 2556

สื่อสารไร้สายด้วยคลื่น RF กับ Arduino UNO

สื่อสารไร้สายด้วยคลื่น RF กับ Arduino UNO

        ถ้ากล่าวถึงการสื่อสารระยะใกล้ๆ โดยที่ไม่ต้องการความแม่นยำของข้อมูลสูง และมีราคาที่ต่ำมากๆ หลายคนคงนึกถึง การสื่อสารด้วยคลื่นวิทยุ (Radio Frequency) ซึ่งในบทความนี้จะมาทดลองสื่อสาร
ผ่านทางคลื่น RF นี้โดยใช้คลื่นความถี่ 433.92 MHz กัน โดยเตรียมอุปกรณ์ตามนี้เลยครับ

1.  Arduino UNO      2          ตัว
2.  RF TRANSMITTER MODULE      1            ตัว
3.  RF RECEIVER MODULE      1      ตัว
4.  LED สี เขียว      3   หลอด
5.  สวิตช์กดติดปล่อยดับ      3      ตัว
6.  Resistor 10 K ohm      3      ตัว
7.  โพรโตบอร์ด      2      อัน
8.  สายไฟสำหรับเชื่อมต่ออุปกรณ์

 

     โมดูลการส่งสัญญาณ (RF Transmitter) 

       เตรียมอุปกรณ์เสร็จเรียบร้อยให้ประกอบวงจรตามรูปเลยครับ
 

 

      โมดูลการรับสัญญาณ (RF Receiver)

        ประกอบวงจรตามรูปด้านล่างได้เลยครับ



        หลังจากที่ได้เตรียมอุปกรณ์และประกอบวงจรเสร็จเรียบร้อยแล้ว ก็มาถึงขั้นตอนการเขียนโปรแกรมกันบ้าง โดยจะแยกโปรแกรมออกเป็น 2 ส่วน เหมือนกันกับวงจรและจะมีโค๊ดส่วนของการตรวจสอบข้อมูลระหว่างการรับส่ง ซึ่งจะเป็นตัวกรองข้อมูลขยะในการรับส่ง โดยมีรายละเอียดตามนี้เลยครับ

       โปรแกรมส่วนของการส่งข้อมูล (RF Transmitter)

#define NET_ADDR 5
#define NETWORK_SIG_SIZE 3

#define VAL_SIZE         2
#define BTN_A            5
#define BTN_B            6
#define BTN_C            7

#define BTN_PRESSED      LOW

const byte g_network_sig[NETWORK_SIG_SIZE] = {0x8F, 0xAA, NET_ADDR};  // Few bytes used to initiate a transfer
int i = 0;

void setup()
{
  pinMode(BTN_A, INPUT);
  pinMode(BTN_B, INPUT);
  pinMode(BTN_C, INPUT);
  Serial.begin(1200);
}

void loop()
{
  int btn_a;
  int btn_b;
  int btn_c;
 
  btn_a = digitalRead(BTN_A);
  btn_b = digitalRead(BTN_B);
  btn_c = digitalRead(BTN_C);
 
  if (btn_a == BTN_PRESSED) {
    writeUInt('A');
  }
  if (btn_b == BTN_PRESSED) {
    writeUInt('B');
  }
  if (btn_c == BTN_PRESSED) {
    writeUInt('C');
  }
  delay(50);
}

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
}


       โปรแกรมส่วนของการรับข้อมูล (RF Receiver)

#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_A    5
#define LED_B    6  
#define LED_C    7
void setup()
{
  pinMode(LED_A, OUTPUT);
  pinMode(LED_B, OUTPUT);
  pinMode(LED_C, OUTPUT);
  digitalWrite(LED_A, LOW);
  digitalWrite(LED_B, LOW);
  digitalWrite(LED_C, LOW);
  Serial.begin(1200);
}

void loop()
{
  switch(readUInt(true)) {
    case 'A' : ledOff();digitalWrite(LED_A, HIGH);break;
    case 'B' : ledOff();digitalWrite(LED_B, HIGH);break;
    case 'C' : ledOff();digitalWrite(LED_C, HIGH);break;
  }
}

void ledOff()
{
  digitalWrite(LED_A, LOW);
  digitalWrite(LED_B, LOW);
  digitalWrite(LED_C, LOW);
}

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

        เมื่อทำการ upload โปรแกรมไปยัง Arduino UNO เรียบร้อยแล้ว ทำการทดสอบโปรแกรม 
จะได้ผลตาม video นี้เลยครับ
 

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


 อ้างอิง  http://www.glacialwanderer.com/hobbyrobotics/?p=291

วันเสาร์ที่ 14 กันยายน พ.ศ. 2556

Raspberry Pi 3G Wifi Hotspot

Raspberry Pi+3G Aircard+Wifi Dongle = RPi 3G Wifi Hotspot

        หลายคนมีโทรศัพท์ที่สามารถทำตัวเป็น Wifi Hotspot ได้ แต่การที่จะใช้โทรศัพท์มาทำเป็น Hotspot นั้นคงจะทำให้แบตเสื่อมในเร็ววันแน่นอน ยิ่งถ้าหากเป็นเครื่องโทรศัพท์ที่เป็นรุ่นที่ราคาแพงๆ ด้วยแล้ว การที่จะเปิดเป็น Hotspot ทิ้งไว้ทั้งวันทั้งคืน คงไม่ใช่เรื่องดีแน่ แต่ถ้าหากใครที่จะลงทุนซื้อโทรศัพท์เครื่องถูกๆ ที่สามารถเปิดเป็น Wifi Hotspot ไว้เพื่อเป็นตัวปล่อยสัญญาณ Wifi ก็ยังคงต้องมีปัญหาเรื่องแบตเสื่อมอยู่ดี ถ้าซื้อมาเพื่อที่จะใช้เป็น Hotspot โดยตรงแล้วอันนี้ก็ไม่ว่ากันครับ
        นอกจากนี้แล้ว ถ้าหากใครมี Router Internet ที่บ้าน ก็จะมีตัวกระจายสัญญาณ Wifi ในตัว
อยู่แล้ว แต่ถ้าหากเป็น Router รุ่นเก่าที่มีเฉพาะสาย Lan ก็สามารถใช้ Raspbery Pi 3G Wifi Hotspot ตัวนี้ได้ หรือจะประยุกต์เป็น Proxy Server ไปเลยก็ได้ครับ
       ก่อนอื่น เริ่มจากเตรียมอุปกรณ์ที่ต้องใช้ให้พร้อมกันก่อน ซึ่งมีรายการดังนี้ครับ

                  1. Raspberry Pi พร้อมลง Raspbian (No Enable Desktop)
                  2. Wifi Dongle
                  3. 3G หรือ 4G Aircard
                  4. Internet SIM (ค่ายไหนก็ได้ ที่สมัครและเปิดบริการ 3G ไว้แล้ว)
                  5. 5V 2A Adapter (จ่ายไฟให้กับ Raspberry Pi อาจจะใช้ Power Bank ก็ได้นะครับ)
                  6. USB HUB (เอาไว้ต่อ Keyboard ให้กับ Raspberry Pi หรืออาจติดตั้งผ่าน SSH ก็ได้)



        จากนั้นก็ทำการประกอบชิ้นส่วนต่างๆ ให้ได้ตามรูปเลยครับ



        เมื่อต่ออุปกรณ์เสร็จเรียบร้อยแล้ว ก็ทำการจ่ายไฟให้กับ Raspberry Pi ของเรากันได้เลยครับ
ให้ระบบทำงานไปจนถึงหน้า Login จากนั้นก็ทำการ Login เข้าระบบตามรหัสผ่านที่ตั้งเอาไว้ตอนติดตั้ง Raspbian (ย้อนกลับไปดูรายละเอียดบทความแรก)
        หลังจากนั้นทำการเชื่อมต่อ Internet กับบอร์ดเพื่อให้สามารถทำการติดตั้งโปรแกรมให้กับ Raspberry Pi เพื่อที่จะทำให้ Wifi Dongle กลายเป็น Access Point และ ติดตั้งโปรแกรม Sakis3g เพื่อใช้ Internet จาก Aircard
        ในที่นี้ขอต่อ Internet ทาง Wifi Dongle ที่ใช้ apt-get ในการ Install โดยแก้ไขไฟล์ตามขั้นตอนดังนี้
        เข้าไปแก้ไขไฟล์ interfaces โดยใช้คำสั่ง
 
        sudo nano /etc/network/interfaces

        จากนั้นแก้ไฟล์ตามนี้เลยครับ

ในกรณีที่ Access Point เป็น WPA

        auto wlan0
        iface lo inet loopback
        iface wlan0 inet dhcp
        wpa-ssid <ชื่อ access point ที่เชื่อมต่อ Internet>
        wpa-psk <รหัสผ่านของ access point>

ในกรณีที่ Access Point เป็น WEP

        auto wlan0
        iface lo inet loopback
        iface wlan0 inet dhcp
        wireless-essid <ชื่อ access point ที่เชื่อมต่อ Internet>
        wireless-key s:<รหัสผ่านของ access point>

       หลังจากนั้นก็กด Ctrl+O (บันทึก) และ Ctrl+X (ออกจากโปรแกรม) เสร็จขั้นตอนนี้แล้วก็ทำการ restart network โดยการใช้คำสั่ง

        sudo /etc/init.d/networking restart

       เมื่อเสร็จขั้นตอนนี้แล้ว ก็จะสามารถใช้งาน Internet ได้แล้วครับ (ขั้นตอนข้างต้นเป็นการติดตั้ง Wifi Dongle ให้ Raspberry Pi รู้จักและเชื่อมต่อระบบเครือข่าย ถ้าหากใช้สาย Lan ไฟล์ interfaces
ก็ไม่ต้องทำการแก้ไข)

       จากนั้นให้ทำการดาวน์โหลดไฟล์ sakis3g.tar.gz มาเพื่อทำการติดตั้งโดยใช้คำสั่ง



       จะได้ไฟล์ sakis3g.tar.gz ที่ directory ที่ใช้คำสั่งนั้น หากโหลดไฟล์ได้สำเร็จจะแสดงหน้าจอดังนี้



        เสร็จแล้วให้ทำการแตกไฟล์ โดยใช้คำสั่ง

     


        ก่อนที่จะทำการ Connect กับ Aircard นั้น จะต้องติดตั้ง usb_modeswitch ให้กับ Raspberry Pi
กันก่อน ซึ่งจะทำให้ Aircard สามารถสื่อสารได้ภายใต้ชื่อ ttyUSB โดยใช้คำสั่งดังนี้

     


        ตอบ Y หลังจากนั้นก็รอให้คำสั่งนั้นประมวลผลจนเสร็จจะได้หน้าจอดังนี้


        จากนั้นให้ reboot Raspberry Pi อีกครั้ง ด้วยคำสั่ง sudo reboot

       เมื่อเข้าสู่ระบบอีกรอบ ทำการติดตั้ง ppp (point to point protocol) ให้กับ Raspberry Pi โดยใช้คำสั่ง


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



       เสร็จขั้นตอนการติดตั้งแล้ว เราจะทำการ Connect 3G อัตโนมัติเมื่อ Raspberry Pi เริ่มทำงานกัน
โดยก่อนอื่น เราจะนำคำสั่ง sakis3g ไปไว้ยัง /usr/sbin เพื่อให้สามารถเรียกใช้ได้ทุกที่โดยไม่ต้องระบุ path โดยใช้คำสั่งดังนี้



        จากนั้นเราจะทำการ connect 3G ที่ startup โดยจะต้องไปแก้ไฟล์ /etc/rc.local โดยเพิ่มคำสั่งของ sakis3g พร้อม parameter ดังนี้

      แก้ไฟล์ตามรูปด้านล่าง โดย APN ของ AIS = internet, DTAC = www.dtac.co.th,
TRUE = hinternet ส่วน user และ pass ตั้งเป็นอะไรก็ได้ (ในที่นี้เป็นชื่อเครือข่าย)



       เมื่อทำการแก้ไขเสร็จเรียบร้อยแล้ว ให้บันทึกและออกจาก editor ได้เลยครับ จากนั้นเราจะมาทำการตั้งค่า Wifi Dongle ของเราให้สามารถทำตัวเป็น Hotspot โดยมีคำสั่งดังนี้
   

        จากนั้นตอบ Y เมื่อ install เสร็จเรียบร้อยแล้วจะมีหน้าจอดังนี้


        จากนั้นทำการแก้ไขไฟล์ /etc/default/udhcpd เพื่อเปิดการทำงานของ dhcp ดังนี้


       เปลี่ยน ip ของ Wifi ให้เป็น static เพื่อเป็น ip เริ่มต้นในการแจก ip โดยแก้ไขไฟล์ /etc/network/interfaces ให้เป็นดังนี้


        จากนั้นให้ทำการแก้ไขไฟล์ /etc/udhcpd.conf โดยกำหนดค่าต่างๆ ดังนี้



 



        ต่อไปก็ทำการแก้ไขไฟล์ /etc/hostapd/hostapd.conf (หากไม่มีให้สร้าง) โดยกำหนดค่าดังนี้


        สามารถตั้ง ssid ได้ตามใจชอบ และเปลี่ยน <yourpasskey> ให้เป็น passkey ของผู้อ่านเอง
        จากนั้นทำการตั้ง hostapd ให้อ่านค่าจาก hostapd.conf โดยแก้ไขไฟล์ /etc/default/hostapd ดังนี้



        หลังจากนั้นทำการตั้งค่า ip forward โดยแก้ไขไฟล์ /etc/sysctl.conf ให้เป็นค่าดังนี้



        เมื่อเสร็จขั้นตอน forward ip แล้ว ให้ตั้งค่า NAT (Network Address Translation) ดังนี้ (หากพิมพ์คำสั่งแล้วเกิด error ขึ้น ให้ใช้คำสั่ง sudo rpi-update แล้ว reboot ก่อนหนึ่งรอบ)

      เพื่อให้ตอน reboot เครื่องแล้วค่าไม่หายไป ทำการบันทึกค่า iptables ลงไฟล์ด้วยคำสั่ง

      เพิ่มคำสั่ง iptable-restore เพื่อทำการตั้งค่าที่บันทึกไว้ เมื่อ Network เริ่มทำงาน ลงในไฟล์ /etc/network/interfaces ดังนี้


        ขั้นตอนสุดท้าย เปิดการทำงานของ hostapd และ udhcpd เมื่อมีการเริ่มระบบ โดยใช้คำสั่งดังนี้

         จากนั้นทำการ reboot Raspberry Pi ด้วยคำสั่ง sudo reboot เท่านี้ก็ได้ Wifi Hotspot ไว้ใช้งานแล้วหล่ะครับ อาจจะมี Power Bank ซักตัว จ่ายไฟให้ จับ RPI เข้ากล่องเสียบ USB เฉพาะ Wifi Dongle และ 3G Aircard ก็เก๋ไปอีกแบบ ว่างๆ ลองทำเล่นดูนะครับ
        ใครมีโปรเจคที่น่าสนใจก็สามารถแชร์ความรู้กันทาง gtalk หรือทางเมลล์ได้นะครับ
olekhanchai@gmail.com หรือสนใจอุปกรณ์สามารถเข้าสั่งซื้อได้ในเว็บ http://www.hobbyembshop.biz หรือสินค้าโปรโมชั่นที่ https://www.facebook.com/hobbyembedded  
ไว้เจอกันคราวหน้าครับ



อ้างอิง:  http://elinux.org/RPI-Wireless-Hotspot