หน้าแรก ดูโปรเจกต์ทั้งหมด
Expert

โปรเจกต์ การเชื่อมต่อ BlueBus Technology photocells เข้ากับ Arduino

ให้ Arduino ทำหน้าที่ควบคุม photocells และ home automation sensors อื่นๆ ที่เชื่อมต่อผ่าน BlueBus Technology

โปรเจกต์ การเชื่อมต่อ BlueBus Technology photocells เข้ากับ Arduino

รายการอุปกรณ์และเครื่องมือ

1x Resistor 4.7 ohm
-
1x Arduino Mega 2560
🛒 สั่งซื้อ
1x Resistor 10k ohm
-
1x Breadboard (generic)
🛒 สั่งซื้อ
1x General Purpose Transistor PNP
-
1x Test Accessory, AC Power Adaptor
-
1x MOSFET Transistor, Switching
🛒 สั่งซื้อ

รายละเอียดและวิธีทำ

ผู้ให้บริการระบบ home automation ที่มีชื่อเสียงรายหนึ่งใช้เทคโนโลยี BlueBus เพื่อเชื่อมต่อ Sensor (เช่น คู่ของ photocells...) เข้ากับ Controlling Unit เรามาลองนำ Sensor เหล่านี้กลับมาใช้ใหม่กับโปรเจกต์ Arduino แบบต่างๆ กันเถอะ

ความท้าทายคือการทำให้ Arduino ทำงานเหมือนกับ Controlling Unit และสามารถอ่านสถานะของ Sensor ได้

BlueBus ประกอบด้วยสายไฟเพียง 2 เส้น โดย Sensor ทั้งหมดจะเชื่อมต่อแบบขนาน (derivation) บนสาย 2 เส้นนี้ ซึ่งทำหน้าที่เป็นทั้งแหล่งจ่ายไฟ (power supply) และตัวกลางในการสื่อสาร

ผมยังไม่พบเอกสารที่มีประโยชน์บนอินเทอร์เน็ตที่อธิบายถึงประเภทของสัญญาณไฟฟ้าและโปรโตคอลการรับส่งข้อมูลสำหรับ Bus นี้เลย แต่ไม่เป็นไร เรามาลองตรวจสอบกันดู...

สำหรับตอนนี้ โปรเจกต์นี้เป็นเพียงการพิสูจน์แนวคิด (proof-of-concept) เท่านั้น

แนวคิดของ Bus

Bus นี้มีแรงดันไฟฟ้า 12V DC ซึ่งใช้ในการจ่ายไฟให้กับอุปกรณ์ที่เชื่อมต่อ (โดยปกติจะเป็นคู่ของ TX และ RX photocells)

นอกจากนี้ยังรองรับการสื่อสารแบบสองทิศทาง (bidirectional communication) ระหว่าง Controlling Unit และอุปกรณ์ต่างๆ โดยการผสมสัญญาณ (modulating) แรงดันไฟฟ้าและกระแสไฟฟ้าด้วย pulses

การสื่อสารจาก Controlling Unit ไปยังอุปกรณ์: ทุกๆ 32ms ตัว Controlling Unit จะตัดการจ่ายไฟของ Bus เป็นช่วงสั้นๆ (pulses) เพื่อสร้างข้อความขนาด 8-bit ข้อความนี้ส่วนใหญ่จะเป็น Address code ของอุปกรณ์ตัวใดตัวหนึ่งที่เชื่อมต่ออยู่ พัลส์เหล่านี้จะถูกส่งไปยังอุปกรณ์ทุกตัว แต่เฉพาะอุปกรณ์ที่มี Address ตรงกันเท่านั้นที่จะตอบกลับไปยัง Controller

การสื่อสารจากอุปกรณ์ไปยัง Controlling Unit: อุปกรณ์ที่ถูกระบุ Address จะเริ่มตอบกลับทันทีหลังจากสิ้นสุดข้อความจาก Controlling Unit โดยใช้ pulses ประเภทเดียวกันเพื่อสร้างข้อความตอบกลับขนาด 8-bit แต่ในกรณีนี้ พัลส์เหล่านี้จะไม่เปลี่ยนแรงดันไฟฟ้า แต่จะเปลี่ยนกระแสไฟฟ้าที่ไหลเวียนใน Bus แทน แต่ละ pulse จะทำให้กระแสไฟฟ้าเพิ่มขึ้นเป็นประมาณ 160mA ตัว Controlling Unit จะเฝ้าติดตามการใช้กระแสไฟฟ้าบน Bus และรับข้อความตอบกลับได้

ความถี่พื้นฐานในการส่ง bits คือ 600Hz ซึ่งหมายความว่าใช้เวลาประมาณ 1.66ms ต่อ bit ระยะเวลานี้จะถูกแบ่งออกเป็น 3 ส่วน โดยแต่ละ bit จะถูกเข้ารหัสเป็นลำดับของระดับ LOW และระดับ HIGH ดังนี้:

                      _0.56_ 
bit "1" |___1.1ms___| |
___1.1ms___
bit "0" |_0.56_| |

ข้อความเต็มรูปแบบประกอบด้วยข้อมูล 8 bits (MSB first) + 1 stop bit (0):

 |------------32ms-------------|      xxxxxxxx: message from ctrlling unit
|xxxxxxxx0-------16.9ms-------| yyyyyyyy: message from device
|xxxxxxxx0yyyyyyyy0---1.8ms---| 0 are the stop bits

ลำดับการถาม/ตอบจะทำซ้ำทุกๆ 32ms

การส่งข้อมูล 00000110 (0x06) + 1 stop bit

การส่งข้อมูล 00010111(0) ตามด้วยการตอบกลับจากอุปกรณ์ 11110011(0)

ในระหว่างช่วงการค้นหาอุปกรณ์ (recognition phase) ตัว Controlling Unit จะสอบถามแต่ละ Address codes ที่เป็นไปได้ของอุปกรณ์ คอยฟังการตอบกลับ (ถ้ามี) และสร้างรายการอุปกรณ์ที่เชื่อมต่ออยู่บน Bus จากนั้นจะสอบถามอุปกรณ์แต่ละตัวทีละตัวและรับข้อความตอบกลับ

Message from Controlling Unit to Devices : aabcccfp
aa : address extension (0 ?)
b : address modifier (ตัวเชื่อมบน board)
ccc : addr ตามที่ตั้งค่าด้วย jumpers
f : reset flag ? ควรเป็น 1 สำหรับการทำงานปกติ
p : parity bit

อุปกรณ์ต่างๆ จะมี jumpers บน Board ซึ่งสามารถกำหนด Address code ได้ตั้งแต่ 1 (ccc=001) ถึง 15 (ccc=111)

ข้อความตอบกลับจะถูกเข้ารหัสบางอย่าง (scrambled) เพื่อตรวจจับการชนกันของข้อมูล (กรณีที่มีอุปกรณ์ 2 ตัวใช้ Address เดียวกันบน Bus):

Reply mmessage from Devices : xxxxyyyy
xxxx xor yyyy xor bccc --> ข้อมูลที่มีผล (4 bits)
(bccc คือ address code ของอุปกรณ์ + address modifier)

ส่วนของฮาร์ดแวร์ (Hardware part)

เพื่อให้ Arduino สามารถส่งข้อความ (ทำหน้าที่เป็น Bus Controlling Unit) และอ่านการตอบกลับจากอุปกรณ์ได้ จำเป็นต้องมีอุปกรณ์ Hardware เพิ่มเติมเพียงเล็กน้อย

Hardware ที่จำเป็นในการส่งและอ่านสัญญาณผ่าน Bus
Vin  : แหล่งจ่ายไฟ 12V จาก Arduino (ใช้ DC adapter)
OC2B : output จาก Arduino,
- เมื่อเป็น LOW : MOSFET จะถูกบล็อก การจ่ายไฟบน bus จะถูกตัด
- เมื่อเป็น HIGH: MOSFET จะนำไฟฟ้า bus จะได้รับไฟจาก Vin
IN : input ของ Arduino สำหรับอ่านการตอบกลับ
- เมื่ออุปกรณ์เพิ่มกระแสไฟฟ้าเป็น 160mA แรงดันไฟฟ้าบน
ตัวต้านทาน 4.7ohm จะเพียงพอที่จะกระตุ้นให้ transistor
และดึงสาย IN ลงไปที่ GND
- เมื่ออุปกรณ์อยู่ในโหมด standby กระแสไฟฟ้าจะค่อนข้างต่ำ transistor จะ
ถูกบล็อก สาย IN จะถูกดึงขึ้นไปที่ Vcc (5V) ซึ่งมาจาก
สาย OC2B
ผลที่ตามมาคือ สาย IN จะแสดงทั้งข้อความที่ส่งออกไป (ที่มีอยู่ใน OC2B) และข้อความตอบกลับ

ส่วนของซอฟต์แวร์ (Software part)

ซอฟต์แวร์นี้มีการใช้ TIMER/COUNTER ภายในของโปรเซสเซอร์ Arduino อย่างหนัก เพื่อสร้าง waveform ที่ต้องการและกลไก interrupt

มีการใช้ 8-bit timer TIMER2/COUNTER2 โดยตั้งค่าในโหมด fast-PWM และใช้สัญญาณ Output OC2B ที่อยู่บน Pin D3 (UNO) หรือ D9 (MEGA):

* Input clock สำหรับ TIMER2 ถูกตั้งค่าเป็น CPU clock หารด้วย 128 ทำให้ได้
ช่วงเวลา 8µs
* ตัวนับ TCNT จะเพิ่มขึ้นทุกๆ 8µs และจะถูก reset เมื่อถึงค่าใน
register OCRA ซึ่งตั้งไว้ที่ 210:
210 * 8µs -> 1.68ms ซึ่งเป็นระยะเวลาของ 1 bit
* เมื่อตัวนับ reset ค่า OC2B output จะถูกตั้งเป็น LOW
* OCR2B จะถูกตั้งค่าเป็น 210/3 (สำหรับ bit "0") หรือ 210*2/3 (สำหรับ bit "1")
* เมื่อตัวนับ TCNT ถึงค่า OCR2B หลังจากผ่านไป 0.56ms หรือ 1.1ms
o ค่า OC2B output จะถูกตั้งเป็น HIGH
o จะมีการสร้าง interupt ขึ้นมา และ ISR routine จะตั้งค่าถัดไป
สำหรับ register OCR2B
เมื่อไม่มีข้อมูลที่จะส่ง OC2B output จะถูกตัดการเชื่อมต่อจาก pin สัญญาณบน pin นั้นก็จะกลายเป็น digital output ปกติ

ISR routine ยังใช้สำหรับอ่านการตอบกลับจาก Pin IN อีกด้วย

* OCR2B ถูกตั้งค่าเป็น 210/2 (ตรงกลาง bit พอดี)
* interrupt เรียกใช้ ISR ในเวลานี้
* ISR อ่านสถานะของ pin IN และตัดสินว่าเป็น bit "0" หรือ "1"
time scale in... ms number of 8µs ticks
_0.56_ __70__
bit "1" |___1.1ms___| | |___140___| |
^ ^
___1.1ms___ ___140___
bit "0" |_0.56_| | |__70__| |
^ ^
interrupt here __| __|

ไฟล์ Source code มีการเขียนคำอธิบายไว้อย่างครบถ้วน และมีข้อมูลเพิ่มเติมอีกมากมายในนั้น

เพื่อให้ใช้งานได้ง่ายจริงๆ Code ได้เตรียมฟังก์ชันพื้นฐานมาให้ (ทุกชื่อจะขึ้นต้นด้วย "BB_") ซึ่งสามารถเรียกใช้จากโปรแกรมหลักได้อย่างง่ายดาย ตัวอย่างการใช้งานทั่วไปอาจเป็นดังนี้:

... insert here the library code, or #include it ...
void setup() {
BB_init(3); // read bus on port D3
BB_on(); // activate bus and communication
delay(1000); // wait for the devices to power-up
BB_recognition(); // initiate a recognition phase
}
void loop() {
BB_Event* e;
while ((e=BB_event_pop())->evt) {
Serial.print("Device ");
Serial.print(e->addr, HEX);
Serial.print(", new status ");
Serial.print(e->status, HEX);
Serial.print(", timestamp ");
Serial.println(e->timestamp);
}
delay(200);
}

บทสรุป

ใช่แล้ว Arduino สามารถทำหน้าที่เป็น BlueBus Controlling Unit และรับสถานะของ photocells หรือ Sensors ที่เชื่อมต่ออยู่ได้!

Code

🔒 ปลดล็อก Code

สนับสนุนเพื่อรับ Source Code หรือแอปพลิเคชันสำหรับโปรเจกต์นี้

รหัสอ้างอิงโปรเจกต์: connecting-bluebus-technology-photocells-to-arduino-766327
2450 บาท
PromptPay QR Code