Sunday, November 18

How to install Debian on Oracle VM VirtualBox Manager

หนึ่งในคำแนะนำสำหรับการจะเป็น Geek ทางด้าน Linux นั่นก็คือ เราจะต้องหัดใช้คำสั่งของ Linux (ที่มีอยู่มากมาย) ให้จงได้ แต่สำหรับใครที่ยังไม่เคยจับ Linux มาก่อน ก็ยังอาจจะกล้าๆ กลัวๆ ที่จะติดตั้ง OS Linux แทน OS Windows แต่ ทุกวันนี้เรามีโปรแกรมประเภท Virtual Machine ซึ่งทำให้เราสามารถที่จะติดตั้งระบบปฏิบัติการที่สอง เข้าไปเพิ่มในระบบปฏิบัติการที่ติดตั้งอยู่ก่อนได้ และนั่นเป็นสิ่งที่ผมกำลังจะนำมาแนะนำให้เพื่อนๆ ให้หันมาใช้ Linux กันครับ

แน่นอนว่า Linux ตัวหนึ่งที่จะมาแนะนำก็ต้องเป็นเหมือน Linux ตระกูลเดียวกันกับที่ติดตั้งอยู่บนบอร์ด Raspberry Pi นั่นก็คือ Debian ครับ วันนี้เราจะมาติดตั้ง Debian บนโปรแกรม Virtual Machine สำหรับ Windows ครับ

Debian on VirtualBox Manager

อันดับแรก ให้ไปดาวน์โหลด
VirtualBox 4.2.4 for Windows hosts  x86/amd64 เพื่อทำสร้าง Virtual Machine
- ต่อมาก็ให้ไปดาวน์โหลดไฟล์ image จาก http://www.debian.org/ แล้วเลือก network install
จากนั้นมองหา Smaller CDs แล้วเลือก i386 (สำหรับ CPU intel) หรือจะเลือกจากลิ้งค์ตรงก็ได้ครับ i386
(http://cdimage.debian.org/debian-cd/6.0.6/i386/iso-cd/debian-6.0.6-i386-businesscard.iso)


เมื่อดาวน์โหลดมาเสร็จแล้ว ให้ติดตั้งไฟล์ VirtualBox 4.2.4 for Windows ก่อน เสร็จแล้วกำหนดค่า กำหนดพื้นที่ ที่จะจำลองเครื่องเสมือน แล้วก็ทำการ mount ไฟล์ image ของ debian เข้าไป แล้วก็เข้าสู่ขั้นตอนการติดตั้งเหมือนติดตั้ง linux ตัวอื่นๆ ทำตามขั้นตอน VDO เลยครับ

แต่ที่จะแนะนำอย่างหนึ่งก็คือ ตอนที่เลือก server สำหรับที่จะเอาไว้ดึงไฟล์อื่นๆ ผมแนะนำให้เลือก server http://mirror.kku.ac.th/ เวลาติดตั้ง package อื่นๆ จะได้เร็วหน่อย ไม่ต้องไปดึงไฟล์จาก server เมืองนอก

อย่าลืม username / password ที่เราสร้างไว้ที่ขั้นตอนการติดตั้ง Debian ด้วยนะครับ เพราะเราต้องใช้มัน login

โดยปกติแล้วโปรแกรม Virtual Machine จะตั้งค่า network ไว้เป็นแบบ NAT ซึ่งจะทำให้ Debian บน Virutal Machine ของเราสามารถต่อออก internet ได้เหมือนกับ windows ของเราครับ ถ้าหาก Debian ใครต่อออกอินเตอร์เนตไม่ได้ก็ให้ลองเช็คตัวนี้ดูครับ สำหรบข้อมูลการปรับแต่ Virtual Machine สามารถหาอ่านได้ตามอินเตอร์เนตครับ ข้อมูลค่อนข้างเยอะอยู่

ทีนี้ก็เหลือแต่ การทดลองใช้งาน แล้วก็ค้นคว้าหาความรู้เพิ่มเติมแล้วครับ ขอให้สนุกกับ Debian ครับ ^^’

ปล. ขอขอบคุณ Liam สำหรับขั้นตอนการติดตั้ง Debian บน Oracle VirtualBox Manager

อ่านเพิ่มเติม...

Wednesday, November 14

Tips : change title bar terminal linux

วันนี้ มากันแบบสั้นๆ ได้น้ำได้เนื้อ ปกติเวลาเรารีโมทไปเครื่อง Linux ผ่านโปรแกรมพวก Putty ซึ่งถ้าหากเราต้องเปิดหน้า terminal หลายๆ หน้าต่าง และแต่ละหน้าต่าง ก็คนละ Server มันคง งง ไม่น้อย เพราะแต่ละ terminal ก็มีแต่ตัวหนังสือเต็มไปหมด ยิ่งถ้าเดินไปกินข้าว หรือกลับมาจากห้องน้ำ มีหวังได้ลืมกันแน่ ว่าหน้าต่างไหน เป็นของ Server ไหน

วันนี้ ผมได้นำเอาเทคนิคดีๆ มาฝากจากอินเตอร์เนตครับ เค้าใช้วิธีรัน shell script แล้วส่งค่า Process, runtime , user login มาแสดงที่ title bar ของโปรแกรม putty เรามาดูกัน

เริ่มแรกก็เปิด terminal ขึ้นมา แล้วพิมพ์คำสั่งนี้ (หรือจะก๊อปปี้ แล้ววางก็ได้ครับ)

while sleep 1;do echo -ne '\033]2;'$USER@$HOSTNAME' '$(uptime)'\007';done &

linux bash tip : change title bar terminal windows

ดูผลลัพธ์ที่ title bar ของ Putty ครับ แล้วลองเทียบค่าที่ปรากฏ กับค่าจากใช้งานคำสั่ง top ดูครับ

ง่ายๆ และมีประโยชน์ด้วยครับ วันนี้ มาสั้นๆ แค่นี้หล่ะ ไปศึกษา Linux ต่อ :P

เครดิต http://www.cyberciti.biz/

อ่านเพิ่มเติม...

Monday, November 12

How to backup and restore Raspian

ในกรณีที่เราต้องการที่จะติดตั้งเวอร์ชั่นใหม่ของ Raspian ซึ่ง ณ ตอนนี้อยู่ที่เวอร์ชั่น 2012-10-28-wheezy-raspbian.zip ซึ่งของผม ก็เก่ามากแหละ จะมีปัญหากับพวก USB wifi dongle อย่างหลีกเลี่ยงไม่ได้ จำเป็นที่จะต้องอัพเกรด ก็ต้องทำแล้วหล่ะ แล้วตอนติดตั้งลงไป แล้วถ้ามันไม่เวิร์กหล่ะ งานที่เคยทำไว้ อยากจะกลับมาใช้ตัวเก่าไปก่อน จะทำงัย????

จากตอนแรกๆ เลย ที่เราใช้โปรแกรม USB Image Tool Backup Raspian จากเครื่อง PC เราใส่ลงไปที่ Sd-Card ในทางตรงกันข้าม เราก็สามารถที่จะทำการ Restore จาก Sd-Card กลับมาลงที่เครือง PC เราได้เช่นกัน

เราจะมาลองทำดูกันนะครับ ทำการถอด Sd-Card ออกจากบอร์ด Raspberry Pi แล้วใส่เข้าไปที่ช่องเสียบ Sd-Card ที่ PC ของเรา จากนั้น เปิดโปรแกรม USB Image Tool ทำการเลือก Drive ที่ตรงกับ Drive ปัจจุบันของ Sd-card ของเรา จากนั้น ทำการเลือก Backup ให้เรา เลือกตำแหน่งที่จะเก็บไฟล์ และกำหนดชื่อไฟล์ที่จะทำการเก็บไว้ ในทีนี้ ไฟล์ที่ถูกเก็บจาก Sd-card ลงมาที่เครื่อง PC เราจะกลายเป็นไฟล์ .img หรือ .ima ก็ได้  รอสักครู่ จนโปรแกรมทำการ Backup ให้เรียบร้อย

save image raspian

ทีนี้ ผมก็ลอง Reastore Raspian เวอร์ชั่น 2012-10-28-wheezy-raspbian.zip ลงไปที่ Sd-card ทำตามขั้นตอนแรกๆ ที่เราเคยทำกันครับ (คลิก) เสร็จแล้วให้สังเกตไฟล์ี่ปรากฏใน Sd-card จะมีวันที่เป็น 10/28/2012 ซึ่งควรจะสัมพันธ์กันกับเวอร์ชั่นของไฟล์ใหม่

file datetime of new raspian

แล้วก็เอา Sd-card กลับไปเสียบที่บอร์ด Raspberry Pi จะเห็นว่า ตอนบูทขึ้นมา จะกลับเข้าสู่หน้า Raspi-config แสดงว่า เราสามารถที่จะ Reastore สำเร็จแล้ว

ทีนี้ ผมก็ถอดสาย power board Raspberry Pi ออกทันที แล้วถอด Sd-card กลับมา เพื่อทำการ Restore Raspian ตัวเก่าของเรากลับเข้าไปคืน ทำเหมือนเดิมทุกอย่างครับ (เลือกไปที่ไฟล์ที่เราได้ Backup เก็บไว้)

ปรากฏว่าใช้ได้ปกติ แสดงว่า เราสามารถที่จะสำรองตัวเก่าไว้ได้ หากเกิดเหตุการณ์ไม่ปกติกับเวอร์ชั่นใหม่ จะทำให้เราสามารถกลับมาใช้ตัวเก่าไปก่อน งานที่เคยทำไว้ จะได้ไม่สะดุดครับ

ปล.จะให้ดี ก็น่าจะซื้อ Sd-card มาเพิ่ม น่าจะดีไม่น้อย จะได้ไม่ต้อง Backup Restore Backup Restore กันไปมา งง ตายพอดี :P

อ่านเพิ่มเติม...

Saturday, November 3

Raspberry Pi and Arduino experiment

จากครั้งที่แล้ว เราได้เปิดการใช้งาน Serial Port ของ Raspberry Pi ไปแล้ว วันนี้เราจะมาลองเพิ่มประสิทธิภาพของ Raspberry Pi ด้วยการเพิ่ม Arduino ให้สื่อสารกับ Raspberry Pi ผ่านทาง Serial Communication โดยจะมีการรับส่ง คำสั่งและส่งค่ากลับผ่านทาง Serial Port ของ Raspberry Pi และ Serial Port ของ Arduino เพื่อเป็นแนวทางในการนำ Arduino มาใช้เป็น I/O ของ Raspberry Pi ซึ่งเราจะได้ I/O ที่เป็นดิจิตอล และ ได้ Analog input เพิ่มจาก Arduino นั่นก็แปลว่า Raspberry Pi เราจะมีความสามารถมากขึ้นไปอีก

ปล. สำหรับมือใหม่ Arduino คือไมโครคอนโทรลเลอร์ ที่มีการอ้างไปหาตำแหน่งหน่วย Input/output ของไมโครคอนโทรลเลอร์ ด้วยรูปแบบที่เหมือนๆ กัน มาใส่ไว้ที่ Bootloader ไม่ว่าจะเอาไมโครคอนโทรลเลอร์ตระกูลใด(ที่สามารถทำได้) ให้มาอยู่ใน Platform ของ Arduino แล้วหล่ะก็ ชื่อของ Input / Output ก็จะเหมือนๆ กัน ทำให้เง่ายต่อการศึกษา และป็นที่นิยมมาก

หลักการ ก็คือ Arduino และ Raspberry Pi เองจะต้องมีการเขียนโปรแกรมเพื่อรอรับค่า และส่งค่า ผ่านทาง Serial Comm เมื่อได้รับคำสั่ง (ที่เราเองเป็นคนกำหนดแล้ว) ก็จะให้แต่ละบอร์ด ไปทำตามคำสั่งนั้น แล้วส่งผลลัพธ์กลับไป ผ่านทาง Serial Comm เหมือนเดิม นั่นก็แปลว่า ทั้งทางฝั่ง Arduino และทางฝั่ง Raspberry Pi จะต้องมีโปรแกรมรองรับเป็นของตัวเอง แต่คุยกันด้วยรูปแบบการสื่อสาร UART  นั่นเป็นหลักการ เปรียบได้กับ ไม่ว่าบอร์ดนั้นจะมาจากไหน ตระกูลใด Platform ใดก็ตาม แต่ถ้าต้องการคุยกันให้รู้เรื่อง ต้องคุยกันเป็นแบบมาตรฐาน เช่น คุยกันรูปแบบ UART  สิ่งที่แต่ละบอร์ดต้องทำนั้นก็คือ ทำให้สัญญาณที่ต้องการจะสื่อสารกันนั้น อยู่ในรูปแบบภาษากลาง เป็นมาตรฐาน (ในที่นี่คือ UART) นั่นเอง เหมือนกันกับ แต่ละชาติ แต่ละภาษา หากต้องการสื่อสารกัน เราจะใช้ภาษาอังกฤษ เป็นตัวกลางในการสื่อสารนั่นเอง

ที่นี่ เรามาลองทำโจทย์กันง่ายๆ ก่อน เพื่อให้เกิดความเข้าใจ ระหว่างการเขียนโปรแกรมให้ Raspberry Pi และ Arduino ให้สื่อสารกันได้ โดยเราจะให้  Raspberry Pi ทำการอ่านค่าการกดสวิทช์ที่ต่ออยู่กับช่องดิจิตอลของ  Raspberry Pi ช่องที่ 24 และ 26 เมื่อมีการกดสวิทช์เกิดขึ้น  Raspberry Pi จะส่งค่าคำขอไปที่ Arduino เพื่อให้ทำการอ่านค่าสัญญาณอะนาล๊อก (ซึ่งอาจจะเป็นค่าจากเซนเซอร์แบบใดๆก็ได้) ในที่นี้ เราจะให้ R ปรับค่าได้เป็นตัวสร้างสัญญาณอะนาล๊อก ที่ช่องสัญญาณ AN0 และ AN1 ของบอร์ด Arduino แล้วให้ Arduino ทำการส่งค่ากลับไปบอก Raspberry Pi ส่วน Raspberry Pi เมื่อได้ค่ามาแล้วให้แสดงผลผ่านทาง Console ต่อไป

ในด้านฮาร์ดแวร์นั้น เนื่องจาก Arduino เองสามารถส่งสัญญาณแรงดันออกมาได้ถึง 5 V เพราะฉะนั้น ที่ด้านส่งข้อมูลออกของ Arduino จะต้องทำการปรับแรงดันให้เหลือ ในระดับที่ปลอดภัยสำหรับ Raspberry Pi เสียก่อน ส่วนทางด้านรับข้อมูลเข้าของ Arduino ไม่จำเป็นต้องปรับแรงดัน เพราะแรงดันจากขาออก 3.3V จาก Raspberry Pi นั้น เป็นระดับที่ Arduino เข้าใจได้

Arduino                                                  Raspberry Pi
   Rx<--------------------------------------------->Tx
   Tx (ปรับลงเหลือ 3.3 V ก่อน)<---------------> Rx
   GND<----------------------------------------->GND

ในการแปลงแรงดันจาก 5V ให้ลดลงเหลือ 3.3V เราใช้วิธี Voltage Divider โดยเราจะใช้ตัวต้านทานค่า 10k ทำการแบ่งแรงดัน  (ผมลองวัดค่าดูแล้ว ค่าไม่เกิน 3.3V และอยู่ในช่วงที่ Raspberry Pi เข้าใจระดับสัญญาณได้)

Raspberry Pi and Arduino Experiment

คำเตือน : ระวังเรื่องของระดับสัญญาณด้วยนะครับ อย่าให้เกิน 3.3V สำหรับตำแหน่งใดๆ ก็ตามที่จะต่อเข้า GPIO ของ Raspberry Pi

การพัฒนาโปรแกรมทางฝั่ง Arduino
สามารถเริ่มต้นศึกษาได้จากตัวอย่างที่ผมได้ทำไว้แล้ว จากที่นี่ http://mechacity.blogspot.com/2011/03/arduino.html  ทำการเขียนโค๊ดบน ARDUINO IDE แล้วทำการโปรแกรมลงบนบอร์ด Arduino
ด้วยโค๊ด

const int analogInPin0 = A0;    // Analog input pin that the potentiometer is attached to
const int analogInPin1 = A1;    // Analog input pin that the potentiometer is attached to

void setup() {
  // initialize serial communications at 115200 bps:
  Serial.begin(115200);
}

void loop() {
  unsigned int cmd;
  unsigned int sensorValue = 0;        // value read from the pot
  if(Serial.available() > 0){
    cmd = int(Serial.read()) - 48;
    switch(cmd){
      case 1:
        sensorValue = analogRead(analogInPin0);
        Serial.print("A0=" );
        Serial.print(sensorValue,DEC);
        Serial.print("|" );
        Serial.flush();
        break;     
      case 2:
        sensorValue = analogRead(analogInPin1);
        Serial.print("A1=" );
        Serial.print(sensorValue,DEC);
        Serial.print("|" );
        Serial.flush();
        break;   
    }
  }   
}

Arduino Firmware

หมายเหตุ : ในระหว่างการทำการโปรแกรมลงบอร์ด Arduino เราต้องไม่ให้ pin RX ของ Arduino ต่ออยู่กับอะไรในวงจร เพราะวงจรในบอร์ด Arduino ต้องใช้ pin RX ในการโปรแกรม (Burn) ลงชิพ

การพัฒนาโปรแกรมทางฝั่ง Raspberry Pi
เรายังคงใช้ภาษา Python แล้วโมดูล Python-serial ในการพัฒนาโปรแกรม โดยนำโค๊ดจากตัวอย่างที่แล้ว มาทำการดัดแปลงให้เข้ากับโจทย์ที่เราจะทดลอง บันทึกชื่อไฟล์ arduinoProj1.py
โค๊ด

#! /usr/bin/python
import serial
import time
import RPi.GPIO as GPIO

GPIO.setmode(GPIO.BOARD)
GPIO.setup(24,GPIO.IN,pull_up_down=GPIO.PUD_UP)
GPIO.setup(26,GPIO.IN,pull_up_down=GPIO.PUD_UP)

ser = serial.Serial('/dev/ttyAMA0',115200,timeout=1)
ser.open()
time.sleep(2)

def readLine(ser):
    str = ""
    while 1:
        ch = ser.read(1)
        if(ch == '|'):
            break
        str += ch
    return str

while True:
    line = ''
    if(GPIO.input(24) == False):
        ser.write('1')
        print 'button1 pressed'
        line = readLine(ser)
    elif(GPIO.input(26) == False):
        ser.write('2')
        print 'button2 pressed'
        line = readLine(ser)
    try:
        if line <> '':
            data = line.split('=')
            print 'Analog channel ' + data[0] + ' value = ' + data[1]
    except KeyboardInterrupt:
        pass
        GPIO.cleanup()
        ser.close()
        print 'Good bye!!!'

Raspberry Pi Firmware

ทดสอบการทำงาน ด้วยการรันโปรแกรมผ่าน Console ด้วยคำสั่ง (ภายใน directory ที่เก็บไฟล์ arduinoProj1.py) ด้วยคำสั่ง sudo ./arduinoProj1.py  จากนั้นทำการกดปุ่มที่ต่ออยู่กับ GPIO 24 และ 26 ของ Raspberry Pi สังเกตผลลัพธ์บนหน้าจอ Console แล้วทดลองปรับค่าความต้านทาน สังเกตการเปลี่ยนแปลง

Arduino and Raspberry Pi

จริงๆ แล้วเราควรที่จะเลือกใช้ Arduino Firmware ที่ยืดหยุ่นกว่านี้ ผมหมายถึง เราไม่ควรทำการแก้ไขโค๊ดที่ฝั่ง Arduino มากนัก แต่ควรจะมีโค๊ดที่สามารถปรับเปลี่ยนการทำงานตั้งแต่ฝั่ง Raspberry Pi เพื่อกำหนดการทำงานของ Arduino แทน ซึ่งในอินเตอร์เนตมี Library ประเภทนี้ อยู่ ตอนต่อไป ผมอาจจะนำมาสาธิตให้ดูนะครับ

สวัสดีครับ

อ่านเพิ่มเติม...

Friday, November 2

minicom - friendly serial communication program

ถ้าหากเราจะมองว่า Hyper Terminal คือโปรแกรมสำหรับ รับ-ส่งค่า ทาง Serial Port คอมพิวเตอร์ ของ Windows แล้วหล่ะก็ โปรแกรม minicom คือโปรแกรมที่ทำหน้าที่คล้ายกันกับ Hyper Terminal ที่สามารถรับส่งค่าผ่านทาง Serial Port ของ Raspberry Pi ที่รันผ่าน Console ของ Linux ได้เช่นกัน

ก่อนอื่น ทำการติดตั้งโปรแกรม minicom ผ่านทาง Console Linux ของเราเสียก่อนครับ ด้วยคำสั่ง

sudo apt-get install minicom

ตอบ y เพื่อยืนยัน รอสักครู่จนติดตั้งโปรแกรมเสร็จ จากนั้น ทดลอง เรียกโปรแกรม โดยเราจะอาศัย UCON-UART ที่ผมได้สาธิตไว้ครั้งก่อนหน้านี้ (ดูวงจรการต่อ) ต่อวงจรเหมือนเดิม แล้วทดลองกับโปรแกรม Serial Port ของ Arduino ครับ ตั้งค่า BaudRate ของ Serial Port ของ Arduino เท่ากับ 115200

จากนั้น พิมพคำสั่ง  minicom -b 115200 -o -D /dev/ttyAMA0  โดยเราจะติดต่อกับ Serial Port ของ Raspberry Pi ซึ่งมองเห็น Device อันนี้เป็น ttyAMA0

หลังจากพิมพคำสั่งแล้ว หน้าต่าง cosole linux ของเราจะเข้าสู่โหมดของ minicom เราสามารถส่งค่าจาก windows ของเรามาที่บอร์ด Raspberry Pi ได้เลย จะปรากฏข้อมูลที่ส่งมาทาง console linux ดังรูปครับ

minicom program

สนใจ parameter เพิ่มเติมของ minicom เราสามารถใช้คำสั่ง man minicom เพื่อดูรายละเอียดเพิ่มเติมได้

ปล. ผมไม่สามารถออกจากหน้าต่าง minicom ได้ แม้ว่าจะได้ทดลองกด Ctrl-A ถึง Z แล้วก็ตาม ในที่นี้ ผมก็เลยต้องเปิดหน้าต่าง putty ขึ้นมาอีกอัน แล้วมองหา process ของ minicom ด้วยคำสั่ง ps aux | grep minicom แล้วทำการ kill -9 process_id_minicom ซะเลย ถึงจะออกจากโหมด minicom ได้

kill process minicom

อ่านเพิ่มเติม...
 

แจกฟรี พื้นที่ฝากไฟล์ 15 GB

ติดตามข่าวสารผ่าน Twitter

ติดตาม Blog นี้

About Me

My photo

สวัสดีครับ ชื่อเปิ้ลนะครับ ถ้ามีอะไรให้ช่วยเหลือได้ ก็จะช่วยครับ
ผมได้สร้างบล๊อกไว้ เพื่อเก็บรวบรวมความรู้ และประสบการณ์ในการทำงานครับ แวะไปเยี่ยมชมกันได้ครับ http://mechacity.blogspot.com และบล๊อก http://faker-programmer.blogspot.com ครับ

Blog อื่นๆของฉัน

Microcontroller Electronics update

สถิติเยี่ยมชมบล๊อก