|
|
ควบคุม อุปกรณ์ ผ่าน พอร์ตเครื่องพิมพ์ (Printer Port) | |
|
เว็บเพจสำรอง (Backup Webpages) : perlphpasp.com | thaiall.com
ปรับปรุง : 2557-01-11 (เพิ่ม assembly ออก port)
สารบัญ
- Printer port คืออะไร
- เครื่องเรามี port เบอร์อะไร
- หลอด 2 บาท ส่องแสง
- printer port ตัวผู้กับ LED 8 หลอด
- รับค่าเข้า printer port ได้ 5 ช่อง
- สั่งให้พัดลมหมุน และหยุด
- โปรแกรมส่งข้อมูลออก printer port ด้วย VB
- Assembly ส่งออกทาง Printer Port
- ใช้ UserPort.exe แก้ปัญหาใน Win XP (คุณโอมแนะนำมา)
Hardware Port คืออะไร
Hardware Port ก็คือ ช่องทาง ที่ CPU ใช้ติดต่อกับ อุปกรณ์พื้นฐานต่าง ๆ โดย ทั่วไปแล้ว Port จะสามารถส่งและ รับข้อมูลได้ หรืออาจจะ ส่ง หรือ รับ อย่างเดียว พอร์ตจะมีหมายเลขประจำตัว สำหรับ แต่ละอุปกรณ์ เพื่อที่ว่า CPU และ Software รวมทั้ง Programmer ที่เขียน โปรแกรม จะได้ระบุถึง อุปกรณ์ที่จะติดต่อได้
Hardware Port ที่พูดถึงนี้ ไม่ใช้ Printer Port (Paralellel Port) หรือ Com Port (Serial Port) หรือ USB ที่อยู่หลังเครื่องนะครับ ... Hardware Port ตัวนี้หมายถึง ระบบระบบหนึ่งที่ CPU ใช้ติดต่อกับ อุปกรณ์ ผ่าน BUS ซึ่ง เจ้าตัวควบคุม Printer Port หรือ Com Port นั่นแหละครับ คืออุปกรณ์
แล้ว Printer Port หรือ Com Port มันคืออะไร ? จริงๆ มันคือ พอร์ตภายนอก หรือ External Port ครับ มีหลายชนิด เยอะแยะมากมาย จริง ๆ เช่น USB Firewire SCSI PS2 KEYBOARD พวกนี้ External Port ทั้งหมดครับ เพราะอยู่นอกเครื่อง แต่ส่วนใหญ่พอร์ต พวกนี้ต้องส่งข้อมูลผ่าน Hardware Port หรือควบคุมผ่านทาง Hardware Port นี่แหละ ครับ
โดยลึก ๆ แล้ว Hardware Port จะทำงานภายใต้ BUS ซึ่งเป็นช่องทางที่ CPU จะติดต่อกับ อุปกรณ์ทุกอย่าง ภายในเครื่อง การรับส่งของ Hardware Port จะทำงานโดยการสั่งงานจาก CPU ดังนั้น การเขียน ก็คือ CPU ต้องการส่งข้อมูลออกไปสู่ Hardware Port และ การอ่าน คือ CPU ต้องการ รับข้อมูลจาก Hardware Port
โดย พัฒน์นนท์ ดวงดารา
|
ที่มา
ผมบอกตนเองเสมอว่าผมไม่ใช่ วิศวกรคอมพิวเตอร์
ผมไม่จำเป็นต้องรู้เรื่องอิเล็กทรอนิกส์ที่เชื่อมกับคอมพิวเตอร์ ผมไม่ต้องการเชื่อมต่ออุปกรณ์ต่าง ๆ ด้วยตนเอง
ทำงานสอน เป็นนักเขียน เป็นดีเจ เป็นเว็บมาสเตอร์ และโปรแกรมเมอร์มาสิบกว่าปี ไม่จำเป็นต้องรู้ หรือต่อเป็น แค่ศึกษาฐานข้อมูลอย่างเดียวก็เหนื่อยแล้ว
แล้วผมก็หนีคำถามไม่พ้น เพราะ คุณศร [sorn_kkc@hotmail.com]
น่าจะเป็นเยาวชนไทย ในสถาบันหนึ่งของไทย
mail มาถามผมเมื่อปลายปี 2547
ว่าทำไมโปรแกรมที่เขาเขียนติดต่อผ่าน printer port แล้วหลอด LED ไม่แสดงผลตามต้องการ
ผมหาข้อมูลจากเว็บไซต์ต่าง ๆ และทดสอบโปรแกรม เพราะคิดว่าหลอด LED คือหลอดที่ติดอยู่กับ printer ผมทดสอบกับ printer หลาย ๆ รุ่น ทุกรุ่นให้ผลเหมือนกัน คือ นิ่งเฉย
ผมไปพบหนังสือภาษาซี ของ ดอนสัน ปงผาบ อ.คณะเทคโนโลยีอุตสาหกรรม ม.ราชภัฏลำปาง (donson@lpru.ac.th) ที่ดวงกมลลำปางเมื่อปลายเดือนกุมภาพันธ์ 2548
จึงทำให้ผมเริ่มเข้าใจว่าสิ่งที่คุณศรต้องการ คือ การสั่งงานอุปกรณ์อิเล็กทรอนิกส์ออกทาง printer port ด้วยภาษาซี
แล้วผมก็เริ่มเข้าใจว่า การสั่งงานอุปกรณ์อิเล็กทรอนิกส์ด้วย code ไม่ถึงคืบนั้น ต้องทำอย่างไร
ผมเริ่มต้นด้วยการซื้อหลอด LED หลอดละ 2 บาทมา 1 หลอด และใช้ลวดทองแดงที่เหลือในกล่องเครื่องมือที่บ้านมา 6 ซม.
จากหลอด LED 1 หลอด และลวดทองแดง 2 เส้น ทำให้ผมเข้าใจการส่งข้อมูล(Outport) และการรับข้อมูลเข้า(Inport) ทาง printer port
แล้วผมก็เริ่มคิดไปไกล ถึงการมอบงานให้นักศึกษาไปทำโครงงานมาส่ง ในวิชาต่าง ๆ โดยเริ่มจากหลอด LED 1 หลอดนี่เอง
ระยะทางหมื่นลี้ เริ่มที่ก้าวแรก
และนี่คือก้าวแรกของผม (มีนาคม 48) |
|
| |
|
อาซิโม (ASIMO = Advanced Step in Innovative Mobility) คือ หุ่นยนต์ฮิวแมนนอยด์ หรือหุ่นยนต์เลียนแบบมนุษย์ของบริษัทฮอนด้า ประเทศญี่ปุ่น สร้างเสร็จเมื่อวันที่ 31 ตุลาคม พ.ศ. 2543 โดยพัฒนาจากหุ่นยนต์ทดลองและหุ่นยนต์ต้นแบบจนทำให้มีขนาดเล็กและน้ำหนักเบา เทคโนโลยี i-WALK ช่วยให้อาซิโมสามารถเดิน วิ่ง ขึ้นบันได และเต้นรำได้ มีระบบบันทึกเสียง เพื่อตอบสนองคำสั่งของมนุษย์ สามารถจดจำใบหน้าคู่สนทนาได้อย่างแม่นยำ และรองรับความต้องการของมนุษย์ในอนาคต
Humanoid Robot ASIMO
ทำให้ความเชื่อที่ว่า มนุษย์คงทำได้แต่หุ่นวิทยุบังคับ เปลี่ยนไป
เพราะเราได้เห็นหุ่นที่มีท่าทางเหมือนคน วิ่ง 2 ขาได้เหมือนคน
แนวคิดการสร้างหุ่นยนต์ในไทยคงก้าวไปได้อีกไกล ไม่ใช่เพียงหุ่นวิทยุบังคับอีกต่อไป
ถ้าเป็นไปได้เราอาจมี irobot หรือ Terminator ใช้ในไม่กี่สิบปีนี้ก็ได้ (
scienceinaction.info,
honda.co.jp,
asimoanime.com,
iloveasimo.com,
honda-robots.com,
world.honda.com,
asimo.zip gallery)
|
| สสวท.(สถาบันส่งเสริมการสอนวิทยาศาสตร์และเทคโนโลยี) ขอเชิญโรงเรียนทั่วประเทศส่งนักเรียนระดับมัธยมศึกษาเข้าร่วมการแข่งขันเขียนโปรแกรมคอมพิวเตอร์ควบคุมหุ่นยนต์ การประกวดโครงงานคอมพิวเตอร์ และการประกวดซอฟต์แวร์
เด็ก ๆ สมัยนี้ทันสมัยมากเพราะ สสวท จัดการแข่งขันเขียนโปรแกรมคอมพิวเตอร์ควบคุมหุ่นยนต์
(IPST Robot Contest) เห็นเริ่มแข่งขันมาตั้งแต่ปี 2002 หรือ 2545
ผู้เข้าแข่งขันต้องศึกษาทั้ง Hardware และ Software ที่สำคัญคือต้องลงทุนทั้งเงิน และเวลา
ศึกษาทั้ง motor และ sensor ส่วนภาษาก็คงหลากหลาย ปีแรกเห็นใช้ Pbasic บางปีใช้ C แสดงว่าไม่ได้กำหนดภาษา
ขึ้นอยู่กับความถนัดแล้วหละครับ
.. ยังไงผมก็ขอเอาใจช่วยครับ
+ http://oho.ipst.ac.th, ipst 2006, fibo 2007, Robotank 3900 บาท, irobot company
+ http://www.etteam.com/downloadf.html มีตัวอย่าง คู่มือ และวิธีแก้ปัญหา port ใน WinXP
| |
- 2007, 2006
- 2005, 2004
- 2003
| ความหมายของ ABU
The Asia-Pacific Broadcasting Union หรือ ABU เป็นการรวมกลุ่มระหว่างสถานีวิทยุและสถานีวิทยุโทรทัศน์ในภูมิภาคเอเชียและแปซิฟิก เพื่อความร่วมมือในการพัฒนากิจการการกระจายเสียงวิทยุและวิทยุโทรทัศน์ในภูมิภาค โดยไม่หวังผลกำไร ก่อตั้งขึ้นในปี ค.ศ. 1964 (พ.ศ. 2507) และปัจจุบันนี้มีสมาชิกทั้งหมด 100 สถานีจาก 50 ประเทศ การส่งกระจายเสียงจากทุกประเทศสมาชิกนั้นสามารถครอบคลุมพื้นที่ 2 ใน 3 ของโลก และครอบคลุมประชากร 3,600 ล้านคน ขณะนี้สำนักงานใหญ่ของ ABU ตั้งอยู่ที่กรุงกัวลาลัมเปอร์ ประเทศมาเลเซีย
ความเป็นมา
สถานีโทรทัศน์ NHK ดำเนินการจัดการแข่งขันประดิษฐ์หุ่นยนต์ระดับอาชีวศึกษา และ อุดมศึกษาที่ประเทศญี่ปุ่นมากว่า 18 ปีแล้ว และภายหลังได้ขยายโครงการไปสู่การแข่งขันในระดับ ภูมิภาค ซึ่งประเทศไทยได้รับเชิญให้เข้าร่วมการแข่งขันดังกล่าวเป็นประจำทุกปี และได้รับรางวัล ชนะเลิศหลายปีติดต่อกัน
ต่อมา ประเทศสมาชิก ABU มีแนวคิดขยายโครงการนี้ให้แพร่หลายยิ่งขึ้น จึงกำหนดจัดการแข่งขันหุ่นยนต์นานาชาติ ABU หรือเรียกชื่อย่อว่า ABU Robocon ระหว่างประเทศสมาชิก ABU โดยประเทศสมาชิกหมุนเวียนกันเป็นเจ้าภาพจัดการแข่งขันขึ้นเป็นประจำทุกปี
+ หุ่นยนต์กู้ภัย 2006, หุ่นยนต์กู้ภัยตัวแรก, หุ่นกู้ภัย
| |
ความรู้เบื้องต้น (Introduction)
- LED (Light Emitting Diode) :: เป็นไดโอดที่สามารถเปล่งแสงได้เมื่อมีกระแสไฟฟ้าไหลผ่าน และต้องไหลให้ถูกขั้ว
- ตัวต้านทาน (Resistor) :: เป็นอุปกรณ์อิเล็กทรอนิกส์ที่ทำหน้าที่จำกัดกระแสไฟฟ้าให้เหมาะสม
- การสร้างวงจร :: ระบบอิเล็กทรอนิกส์ทุกระบบสร้างขึ้นจากส่วนประกอบพื้นฐานเพียงไม่กี่ชนิด ส่วนประกอบเหล่านี้ไม่สามารถทำงานให้เกิดประโยชน์ใด ๆ ได้โดยลำพัง แต่เมื่อนำมาต่อรวมกันเป็นวงจร จะก่อให้เกิดความหลากหลายของเทคโนโลยีทางอิเล็กทรอนิกส์ขึ้นการออกแบบวงจรอาศัยการคำนวณ เป็นหลัก ในปี ค.ศ. 1845 นักวิทยาศาสตร์ชาวเยอรมันชื่อ กุสตาฟ คีร์ชฮอฟฟ์ เป็นผู้บัญญัติกฎเกี่ยวกับการไหลของไฟฟ้าระหว่างส่วนต่าง ๆภายใน วงจรที่ช่วยไขความกระจ่างว่าวงจรทำงานอย่างไร การออกแบบวงจรสำเร็จรูปที่พบเห็นในหนังสือหรือวงจรเบ็ดเสร็จ (หน้า 52-53)ล้วนแต่เป็นวงจร สำหรับการทำงานพื้นฐานทั้งสิ้นนักออกแบบจะต้องรู้จักวงจรเหล่านี้เป็นอย่างดีจึงจะตัดสินใจได้ว่าจะนำมาเชื่อมโยงเข้าด้วยกันเพื่อให้ทำงานตามที่ ต้องการได้อย่างไร เมื่อออกแบบได้แล้ว จีงลงมือประกอบวงจรให้สำเร็จเรียบร้อย ในช่วงก่อนทศวรรษ 1960การเชื่อมต่อชิ้นส่วนของวงจรยังต้อง ใช้เส้นลวดและอาศัยมือช่วย พัฒนาการของแผงวงจรพิมพ์เป็นแผ่นพลาสติกเจาะรูเพื่อเสียบยึดส่วนประกอบและร้อยเส้นโลหะสำหรับเชื่อมต่อกัน ทำให้ในปัจจุบันเราประกอบวงจรได้โดยใช้เครื่องจักรเป็นการช่วยลดค่าใช้จ่ายในการผลิตสิ่งประดิษฐ์ทางอิเล็กทรอนิกส์ลงไปอย่างมาก
|
|
1. Printer port คืออะไร
Computer เกือบทุกเครื่องมี port แบบนี้ ยกเว้น notebook บางรุ่น
Port แบบนี้มี 25 เข็มสำหรับเชื่อมต่อ และมีการแบ่งกลุ่มเข็มเห็นหลาย ๆ กลุ่ม
- กลุ่มส่งข้อมูลออก (Output) ช่อง 2 ถึง 9
- กลุ่มรับข้อมูลเข้า (Input) ช่อง 10 ถึง 15 เว้น 14
- กลุ่มสายดิน (Ground) ช่อง 18 ถึง 25
ภาพจาก machinegrid.com
ข้อมูล : ไดโอดเปล่งแสง (LED=Light-Emitting Diode) หลอดละ 2 บาท ที่ลำปางซื้อได้ที่ร้านชุมพล อิเล็กทรอนิกส์
|
|
2. เครื่องเรามี port เบอร์อะไร
หลายคนมั่นใจว่าเครื่องฉันมี printer port 0378 แน่นอน เพราะเว็บไหน ๆ ก็พูดถึง port นี้ แล้วผมก็ไปพบเครื่องที่สถาบันเครื่องหนึ่ง
มี port เป็น 03bc พอแก้เลข port ใน source code สำหรับการติดต่อ ก็สามารถสั่งงานอุปกรณ์ และเห็นผลการทำงานอย่างถูกต้อง คำถามคือเครื่องของคุณมี printer port เบอร์อะไร ตรวจสอบได้อย่างไร
เริ่มต้นไม่ต้องลงทุนเยอะครับ ไปร้านขายอุปกรณ์อิเล็กทรอนิกส์ แล้วซื้อหลอด LED หลอดละ 2 บาท มา 1 หลอด
เพราะดูว่าเวลาคุณส่งข้อมูลออกทาง printer port มีไฟที่หลอด LED ไหม ซื้อมาแล้วก็ไม่ต้องกลับครับ แยงเข้ารูทาง printer port ไปเลย แต่แทงเบา ๆ มือหน่อยครับ อย่าฝืน อย่าเร่ง
หลอดไฟมีขั้วบวก และขั้วลบนะครับ เสียบขั้วลบที่ช่องเบอร์ 22 แล้วขั้วบวกที่ช่องเบอร์ 9 (รายละเอียดเรื่องเบอร์จะอธิบายทีหลัง)
ถ้าไม่รู้ว่าปลายด้านไหนบวกหรือลบ ก็ให้ลองสลับดู ไม่ต้องกลัวไฟดูดครับ ไม่มีปัญหาแน่นอน สำหรับกรณีปกติ เพราะทดสอบสลับกันบ่อย ๆ ในช่วงแรก ๆ ที่ดูไม่ออกว่าอันไหนบวกหรือลบ
จาก http://www.beyondlogic.org/spp/parallel.htm
โปรแกรมนี้ทำหน้าที่ แสดงเลข printer port ของเครื่องเรา จะได้สั่งงานถูกเบอร์ ถ้ามีหลายเบอร์ให้เลือก LPT1
prt0.c : prt0.exe 9 KB
#include <stdio.h>
#include <dos.h>
void main(void) {
unsigned int far *ptraddr; /* Pointer to location of Port Addresses */
unsigned int address; /* Address of Port */
int a;
ptraddr=(unsigned int far *)0x00000408;
for (a = 0; a < 3; a++) {
address = *ptraddr;
if (address == 0)
printf("No port found for LPT%d \n",a+1);
else
printf("Address assigned to LPT%d is %Xh\n",a+1,address);
*ptraddr++;
}
delay(5000);
}
|
|
3. หลอด 2 บาทส่องแสง
โปรแกรมข้างล่างนี้ทำหน้าที่ดับไฟทุกหลอด และแสดงไฟทุกหลอด แม้เราจะมีหลอดเดียว ก็แสดงหลอดเดียว ไม่เห็นเป็นไรนี่ครับ
ตัวโปรแกรมส่งข้อมูบออกทาง printer port ทั้งหมด 8 ช่องคือ ช่อง 2 ถึง ช่อง 9 แต่เรามีหลอดไฟรับที่ช่องที่ 9 ช่องเดียว ช่องอื่นไม่มีหลอดไฟรับ ก็ไม่เห็นจะเป็นไร
ผลการทำงานใน windows 98 หรือ windows ME จะเห็นหลอดติด และดับสลับกันทุก 1 วินาที แต่ถ้าเป็น windows XP จะไม่แสดงการติดดับให้เห็น แต่จะแสดงสถานะสุดท้ายของคำสั่ง เพราะเป็น security ของ windows XP ครับ
จากแนวทางในหนังสือของ ดอนสัน ปงผาบ
โปรแกรมนี้ทำหน้าที่ ส่งไฟฟ้าออกทางเข็มที่ 2 ถึง 9 และหยุดส่งสลับกันไป พร้อมแสดงให้เห็นทางจอภาพด้วยว่าอยู่สถานะไหน
prt1.cpp : prt1.exe 12 KB
#include <stdio.h>
#include <dos.h>
#include <conio.h>
#include <process.h>
main () {
unsigned int far *ptraddr;
unsigned int address;
ptraddr=(unsigned int far *)0x00000408;
address = *ptraddr; // 0x378 or 0x3bc
do {
outportb(address,0x00);
printf ("00000000");
delay(1000);
if (kbhit()) exit(0);
outportb(address,0xff);
printf ("11111111");
delay(1000);
clrscr();
} while (!kbhit());
}
|
|
4. printer port ตัวผู้กับ LED 8 หลอด
ย่ามใจขึ้นมาก เมื่อเห็นหลอดติดดับ เหมือนกับตาของ Terminator 3 กำลังกะพริบ
ผมโชคดีที่มีคนรู้จักเรียน ปวช สายช่าง จึงไปยืมหัวแร้งบัดกรี สำหรับละลายตะกั่ว พร้อมกับไปซื้อตะกั่วมา 20 บาท
หลอด LED 8 หลอด และprinter port ตัวผู้ 12 บาท รวมแล้วกว่า 50 บาท
ในเมื่อเห็น 1 หลอดทำงาน จะปล่อยให้อีก 7 หลอดว่างทำไม ผมจึงทำอุปกรณ์ตัวนี้ขึ้นมา
เพื่อหยิบไปสาธิตให้นักศึกษาดูได้โดยง่าย และถาวร กว่าดึงหลอด LED เข้า ๆ ออก ๆ จาก printer port ตัวเมีย
การดึงเข้าดึงออกบ่อย ๆ อาจทำให้ช่องนั้นสึกได้ การทำอุปกรณ์นี้ ก็ละลายตะกั่ว เพื่อยึดเข็มเข้ากับด้านหลัง
ของ printer port ตัวผู้ โดยขั้วบวกอยู่ที่เบอร์ 2 ถึง 9 ส่วนขั้วลบอยู่เบอร์ 18 ถึง 25
การจับคู่ดี ๆ ทำให้การบัดกรีง่ายขึ้น
ผลการบัดกรี พบปัญหาขาของหลอด LED ติดกัน ผลการทำงานจึงผิดพลาดไป ผมไปหาเศษลิบบิ้นในกล่องเข็มของภรรยา
มาตัดเป็นชิ้นเล็ก ๆ กั้นระหว่างขาที่ติดกันเท่านั้น .. ผมกะว่าจะไปถามนักศึกษาของผมว่า แผ่นขาวเล็ก ๆ ทำหน้าที่อะไร และทำมาจากอะไร
สารภาพ ว่างานนี้ทำแบบลวก ๆ ง่าย ๆ ไม่ได้ทำตามต้นแบบในหนังสือที่ต้องใช้ register หรือตัวต้านทาน
และแผ่นพิมพ์เขียว เพราะผมทดสอบแล้วไม่มีปัญหา ก็ไม่รู้ว่าจะหา register มากั้นทำไม เอาง่าย ๆ ลวก ๆ และเสร็จเร็วเข้าว่าครับ
แต่ถ้าสั่งให้นักศึกษาของผมทำ คงต้องทำให้ดีกว่าที่ผมทำแน่ .. เพราะผมชอบบอกว่าตัวอย่างที่ผมทำคือตัวอย่างที่ไม่ดี คุณต้องทำให้ดีกว่านี้
จากแนวทางในหนังสือของ ดอนสัน ปงผาบ
4.1 โปรแกรมนี้ทำหน้าที่ แสดงให้เห็นเลขฐานสอง ของค่า 0 ถึง 255 ผลคือหลอด LED ติด และดับ สลับกันอย่างมีนัย
prt2.cpp : prt2.exe 9 KB
#include <stdio.h>
#include <dos.h>
#include <conio.h>
main () {
unsigned int far *ptraddr;
unsigned int address;
ptraddr=(unsigned int far *)0x00000408;
address = *ptraddr;
int i;
int j = 256;
int d = 1000; // 1000 = 1 second
for (i=0;i<j;i++) {
outport(address,i);
printf("%d = %xh\n",i,i);
delay(d);
if(kbhit()) i = j;
}
}
4.2 โปรแกรมนี้ ทำหน้าที่ เรียก prt2.exe มาทำงานตลอดไป จนกว่าจะกดปุ่ม CTRL-C
loop.bat
:start
prt2.exe
goto start
|
|
5. รับค่าเข้า printer port ได้ 5 ช่อง
ตัวอย่างโปรแกรมนี้ จะส่งค่าเข้า 2 ช่อง คือช่องที่ 13 และ 15 หากใช้งานจริง
จะต้องใช้ปุ่ม switch เข้ามาควบคุมการเปิดปิด ผลของการรับได้ 5 ช่อง ทำให้มีคำสั่งแตกต่างกันได้ 32 คำสั่ง
สำหรับตัวอย่างนี้แสดงให้เห็นค่าที่เปลี่ยนไป เมื่อดึงลวดเข้าออก
โปรแกรมนี้ทำหน้าที่ แสดงให้เห็นว่าดึงลวดเข้า และออก จะส่งค่าที่แตกต่างกันให้กับโปรแกรมนำไปใช้ได้
prt3.cpp : prt3.exe 9 KB
// printer have pin 1 - 13 and 14 - 25
// pin10=64 pin11=-128 pin12=32 pin13=16 pin15=8
// if pin13 + pin15 = 24
#include <stdio.h>
#include <dos.h>
#include <conio.h>
main () {
unsigned int far *ptraddr;
unsigned int address;
ptraddr=(unsigned int far *)0x00000408;
address = *ptraddr;
int vin = 0; // value input
int d = 3000; // 1000 = 1 second
int start = inport(address + 1);
do {
vin = inport(address + 1);
if (vin != start)
printf("%d %d \n",vin,start - vin );
else
printf(".");
delay(d);
} while(!kbhit());
}
+ ตัวอย่างชุดคิท futurekit.com , qkits.com ที่นำใช้ได้ทันที
+ โฟโต้ทรานซิสเตอร์ (Phototransistor) คือสารกึ่งตัวนำชนิดหนึ่ง ที่มีความไวต่อแสงมาก โฟตอนจากแสงอินฟาเรดที่ส่งมา มีผลให้เกิดอิเลคตรอนอิสระหลุดออกมาจากสารกึ่งตัวนำชนิดหนึ่ง (สาร P) แล้ววิ่งทะลุผ่านรอยเชื่อม (Junction) ไปยังสารกึ่งตัวนำอีกชนิดหนึ่ง (สาร N) ซึ่งส่งผลให้เกิดกระแสไฟฟ้าขึ้น โดยปริมาณของกระแสจะเป็นสัดส่วนกับความเข้มของแสง
+ Workshop เซ็นเซอร์ตรวจจับแสงอินฟาเรด ที่ mut.ac.th
+ ชุดอิเล็กทรอนิกส์ใช้ IR LED บน Robot ที่ thaizone99.com, robotroom.com
|
|
6. สั่งให้พัดลมหมุน และหยุด
หลังจากสามารถรับข้อมูลผ่าน printer port โดยใช้หลักการของ switch ปิดเปิด ผมใช้ลวดทองแดงทดสอบก่อน ก็ใช้ได้ แต่จะหา switch มาสั่งงาน คงยังไม่ถึงเวลา จึงหันไปศึกษาการแสดงผลใน Windows XP อีกครั้งที่มีปัญหา 2 เรื่องคือ เลข port ที่ใคร ๆ ก็ใช้ 0x0378 แต่บางเครื่องใช้ 0x3bc จึงแก้โปรแกรมทั้งหมดในเว็บเพจนี้ ให้ตรวจ port อัตโนมัติ
อีกปัญหาพบเฉพาะใน Windows XP เรื่อง security ที่ระบบไม่ยอมให้สั่งงานออกทาง port แต่ผมพบว่าสั่งงานหลาย ๆ ครั้ง จะมีผลเฉพาะครั้งสุดท้าย จึงเขียนโปรแกรมสั้น ๆ ขึ้นมา 2 โปรแกรม สำหรับส่งข้อมูลออกทุกช่อง และยกเลิกการส่งข้อมูล
เพราะนำไปใช้ตรวจสอบการส่งข้อมูล สำหรับกรณีนี้ผมต้องการทดสอบการทำงานของพัดลมที่อาศัยไฟฟ้าจากภายนอกเป็นตัวขับมอเตอร์ ก็ได้ผลเป็นที่น่าพอใจ สำหรับก้าวแรก
6.1 โปรแกรมนี้ทำหน้าที่ สั่งให้เลิกส่งค่าออก output port ทั้ง 8 ช่อง
prt1a.cpp : prt1a.exe 6 KB
#include <dos.h>
main () {
unsigned int far *ptraddr;
unsigned int address;
ptraddr=(unsigned int far *)0x00000408;
address = *ptraddr; // 0x378 or 0x3bc
outportb(address,0x00);
}
6.2 โปรแกรมนี้ทำหน้าที่ สั่งให้ส่งค่าออก output port ทั้ง 8 ช่อง
prt1b.cpp : prt1b.exe 6 KB
#include <dos.h>
main () {
unsigned int far *ptraddr;
unsigned int address;
ptraddr=(unsigned int far *)0x00000408;
address = *ptraddr; // 0x378 or 0x3bc
outportb(address,0xff);
}
6.3 โปรแกรมนี้ทำหน้าที่ เรียกโปรแกรม prt1a.exe และ prt1b.exe มาทำงาน
prt1ab.bat
@echo off
echo test for Windows XP
prt1b
pause
prt1a
pause
prt1b
pause
prt1a
|
7. โปรแกรมส่งข้อมูลออก printer port ด้วย VB
ได้โปรแกรม dllport.zip จาก thaiio.com ซึ่งน่าจะได้มาจาก thaibit.hypermart.net อีกทีหนึ่ง
แต่ที่ hypermart.net ไม่มีแล้ว ก็เกรงว่าสักวันโปรแกรมนี้จะหายไปอีก
จึงได้ทดสอบ และปรับปรุงโปรแกรมนิดหน่อย แล้ว zip ไว้ในชื่อ dllport.zip เหมือนเดิม โดยเปลี่ยนหน้าตามเป็นตามที่เห็น
โปรแกรมนี้สามารสั่งเปิดปิด ใน WindowsXP ได้ แต่ถ้าใช้ Assembly บน WindowsXP ผมยังเปิดปิด port ไม่ได้ จึงต้องใช้โปรแกรมนี้ทดสอบ ซึ่งได้ผลเป็นที่น่าพอใจ
- ก่อนปรับปรุง : http://www.thaiio.com/Appdown/Dllport.zip
- หลังปรับปรุง : dllport.zip version 1.48
- คลิ๊ปสาธิต : http://www.youtube.com/watch?v=28B6joSbInU
| |
8. Assembly ส่งออกทาง Printer Port
+ ตัวอย่างง่าย ๆ จาก http://www.mattjustice.com/parport/par_asm.html
+ โปรแกรม on.com และ off.com มีปัญหากับการทำงานใน WindowsXP ที่ยังไม่ใช้ userport.exe
+ ถ้าต้องการทดสอบต้องใช้ dllport.zip
เขียนแล้วทดสอบ ส่งออก 2 ช่อง
c:\>debug
-a
mov al,48 ; 0100-1000 8-bit in al
mov dx,378 ; parallel port is 378h
out dx,al ; write it
mov ax,4C00 ; return to DOS
int 21h
-g
onoff.bat ควบคุมการเปิดปิด
:loop
on.com
pause
off.com
pause
goto loop
| สร้างแฟ้ม on.com เปิดไฟ
c:\>debug
-n on.com
-a
mov al,ff ; 1111-1111
mov dx,378
out dx,al
mov ax,4C00
int 21h
-rcx
b
-w
-q
c:\>on | สร้างแฟ้ม off.com ดับไฟ
c:\>debug
-n off.com
-a
mov al,00 ; 0000-0000
mov dx,378
out dx,al
mov ax,4C00
int 21h
-rcx
b
-w
-q
c:\>off |
|
9. ใช้ UserPort.exe แก้ปัญหาใน Win XP
+ รับ mail จากคุณ โอม ohm10513@hotmail.com แนะนำการแก้ปัญหา port ใน xp ใน etteam.com
+ ไม่จำเป็นต้องใช้ UserPort กับ dllport เพราะไม่พบปัญหา ถึงใช้ก็ไม่พบปัญหาเช่นกัน
+ ถ้าใช้ UserPort จะทำให้โปรแกรมที่เขียนด้วยภาษา Assembly หรือภาษา C มีปัญหา ใช้งานไม่ได้ทันทีเลย จากที่เคยใช้ได้หลังจบการทำงาน
การใช้ภาษา Assembly หรือภาษา C ควบคุมการทำงานของ Printer Port ใน Windows XP เกิดปัญหาคือ ไม่มีผลแบบทันทีทันใด ต่างกับ WinMe หรือ Win98 ที่ไม่พบปัญหา
ปัญหานี้คาใจมานานในหัวข้อก่อนหน้านี้ ในที่สุดคุณโอม ก็บอกว่าโปรแกรม userport.exe ใช้แก้ปัญหาเรื่องการควบคุม Port ใน WindowsXP ได้
สามารถ download ได้จาก http://www.etteam.com/download/UserPort.zip นอกจากนั้นในเว็บไซต์ etteam.com
ยังมีตัวอย่างโปรแกรมที่เขียนด้วย SBASIC, ASSEMBLY คู่มือ และ Compiler ที่เกี่ยวข้องกับการเขียนโปรแกรมควบคุมหุ่นยนต์อีกด้วย
ขั้นตอนการแปล และใช้งาน IOPort.exe ร่วมกับ UserPort.exe
1. ใช้ TC 3.0 กับ IOPort.c ไม่ได้ เพราะมีหลายคำสั่งที่ TC 3.0 ไม่รู้จัก เนื่องจากเป็นตัวแปลรุ่นเก่า
2. จึงติดตั้ง BCC5.5 ( download ) แล้วลองเขียน IOPort.c ให้ compile ด้วย c:\borland\bcc55\bin>bcc32 IOPort.c
3. ผลการ compile ผ่าน แต่ถามหา tasm32.exe
4. จึงติดตั้ง TASM5.0 ใน c:\tasm ( download 4.2 MB ) Official site
5. ติดตั้ง TASMPT ( download ) เพื่อแก้ไข TD32.exe และ TASM32.exe ให้ใช้ร่วมกับ Borland C++
6. เพิ่ม path โดยพิมพ์ c:\>path = %path%;c:\tasm\bin หรือไปเพิ่มใน environment variable
7. คลาย .zip แฟ้มที่ได้มาลงไปในห้องที่เก็บ TD32.exe และ TASM32.exe แล้วประมวลผลแฟ้ม patch.exe พิมพ์ tasm32 และ td32
8. ทดสอบ bcc32 IOPort.c อีกครั้งพบ unable to open file 'C0X32.OBJ' จึงต้องสร้างแฟ้ม bcc32.cfg แล้วเพิ่ม 2 บรรทัดนี้ลงไป
-I"c:\Borland\Bcc55\include"
-L"c:\Borland\Bcc55\lib"
9. นำโปรแกรม IOPort.c มาเพิ่ม main ก็จะ compile และ run ได้ ผลของโปรแกรมทำให้หลอดไฟติดดับสลับกัน 3 ครั้ง
10. ก่อนประมวลผล IOPort.exe ที่ได้จากการ compile ต้อง Start โปรแกรม Userport ก่อน
+ โปรแกรม UserPort พัฒนาโดย Tomas Franzon ( tomas_franzon@hotmail.com v.1 yr.2001) http://www.ddj.com
# UserPort.SYS is a kernel mode driver for Windows NT/2000 that gives usermode programs access to I/O
Ports. This makes it possible to access hardware directly from a normal executable in the same way as under
Windows 95/98/ME. This driver does not work on Windows 95/98/ME and there is really no need to run it
anyway because I/O ports are always granted to usermode programs on these operating systems.
The driver can be used for the following purposes:
To run software on Windows NT/2000 that normally only runs on Windows 95/98/ME.
To easily access hardware like the parallel port and other I/O ports.
So whats the drawbacks with this wonderful software? Microsoft has for security reasons prohibited usermode
access to I/O ports. Opening up I/O ports creates a big security hole in your system. You should therefore
carefully set the grant lists to only give usermode access to the specific I/O ports you need. The default values
opens up a wide range of I/O ports and you should narrow it down.
If you are writing your own software you should only grant access through the file \\.\UserPort. Access is then
given to your program when you open the file \\.\UserPort. Other programs that dont open \\.\UserPort will
not have access to these I/O ports.
|
10. แผงโซล่าร์เซล หรือ เซลล์สุริยะ (Solar Cell) แบบ แบบผลึกเดี่ยว (Single Crystal) ให้พลังงานไฟฟ้าจากพลังงานแสงอาทิตย์ #
เซลล์แสงอาทิตย์ (Solar Cell) เป็นสิ่งประดิษฐ์กรรมทางอิเลคทรอนิกส์ ที่สร้างขึ้นเพื่อเป็นอุปกรณ์สำหรับเปลี่ยนพลังงานแสงอาทิตย์ให้เป็นพลังงานไฟฟ้า โดยการนำสารกึ่งตัวนำ เช่น ซิลิกอน ซึ่งมีราคาถูกที่สุดและมีมากที่สุดบนพื้นโลกมาผ่านกระบวนการทางวิทยาศาสตร์เพื่อผลิตให้เป็นแผ่นบางบริสุทธิ์ และทันทีที่แสงตกกระทบบนแผ่นเซลล์ รังสีของแสงที่มีอนุภาคของพลังงานประกอบที่เรียกว่า โฟตอน (Proton) จะถ่ายเทพลังงานให้กับอิเล็กตรอน (Electron) ในสารกึ่งตัวนำจนมีพลังงานมากพอที่จะกระโดดออกมาจากแรงดึงดูดของอะตอม (atom) และเคลื่อนที่ได้อย่างอิสระ ดังนั้นเมื่ออิเล็กตรอนเคลื่อนที่ครบวงจรจะทำให้เกิดไฟฟ้ากระแสตรงขึ้น เมื่อพิจารณาลักษณะการผลิตไฟฟ้าจากเซลล์แสงอาทิตย์พบว่า เซลล์แสงอาทิตย์จะมีประสิทธิภาพการผลิตไฟฟ้าสูงที่สุดในช่วงเวลากลางวัน ซึ่งสอดคล้องและเหมาะสมในการนำเซลล์แสงอาทิตย์มาใช้ผลิตไฟฟ้า เพื่อแก้ไขปัญหาการขาดแคลนพลังงานไฟฟ้าในช่วงเวลากลางวัน
|
")
if(url == "www.thainam") document.write("")
if(url == "www.thaiabc") document.write("")
-->