السيارة الحديثة ليست وسيلة نقل فحسب ، بل هي أيضًا أداة متقدمة مع وظائف الوسائط المتعددة ونظام تحكم إلكتروني للوحدات ومجموعة من أجهزة الاستشعار. يقدم العديد من مصنعي السيارات وظائف مساعدي الحركة ، ومساعدي وقوف السيارات ، ومراقبة السيارة والتحكم من الهاتف. هذا ممكن بسبب استخدام حافلة CAN في السيارة التي تتصل بها جميع الأنظمة: المحرك ، نظام الفرامل ، عجلة القيادة ، الوسائط المتعددة ، المناخ ، إلخ.سيارتي 2011 سكودا اوكتافيا. لا يوفر إمكانات التحكم من الهاتف ، لذلك قررت إصلاح هذا العيب ، وفي الوقت نفسه أضف وظيفة التحكم الصوتي. كبوابة بين ناقل CAN والهاتف ، أستخدم Raspberry Pi مع درع CAN BUS وموجه TP-Link WiFi. تم إغلاق بروتوكول الاتصال الخاص بالركام التلقائي ، وردت فولكس واجن على جميع رسائلي مع توثيق البروتوكول. لذلك ، فإن الطريقة الوحيدة لمعرفة كيفية تواصل الأجهزة في السيارات ومعرفة كيفية إدارتها هي الهندسة العكسية لبروتوكول CAN لحافلة VW.تصرفت على مراحل:- تطوير درع CAN ل Raspberry Pi
- تثبيت برنامج للعمل مع ناقل CAN
- الاتصال بحافلة CAN للسيارة
- تطوير الشم ودراسة بروتوكول ناقل CAN
- تطوير تطبيق الهاتف
- التحكم الصوتي مع Homekit و Siri
في نهاية نافذة التحكم الصوتي بالفيديو.تطوير درع CAN ل Raspberry Pi
هنا ، تم أخذ مخطط الدرع بواسطة lnxpps.de/rpie ، وهناك أيضًا وصف للاستنتاجات ، يتم استخدام دائرتين دقيقتين MCP2515 و MCP2551 للتواصل مع CAN. يتم توصيل سلكين CAN-High و CAN-Low بالدرع. في SprintLayout 6 ، قمت بنشر اللوحة ، يمكن لأي شخص أن يأتي في CANBoardRPi.lay سهل الاستخدام (في صورة العنوان ، النموذج الأولي للدرع على لوحة التوصيل).

تثبيت برنامج للعمل مع ناقل CAN
في Raspbian البالغ من العمر عامين ، كنت بحاجة إلى تصحيح bcm2708.c لإضافة دعم CAN (ربما هذا غير مطلوب الآن). للعمل مع ناقل CAN ، تحتاج إلى تثبيت حزمة الأداة المساعدة can-utils من github.com/linux-can/can-utils ، ثم تحميل الوحدات ورفع واجهة العلبة:
insmod spi-bcm2708
insmod can
insmod can-dev
insmod can-raw
insmod can-bcm
insmod mcp251x
ip link set can0 type can bitrate 125000 loopback on
ifconfig can0 up
نتحقق من أن واجهة CAN قد ارتفعت باستخدام الأمر ifconfig :
يمكنك التحقق من أن كل شيء يعمل عن طريق إرسال الأمر واستلامه.في محطة واحدة نستمع:root@raspberrypi ~
في محطة أخرى ، نرسل:root@raspberrypi ~
يتم وصف عملية تثبيت أكثر تفصيلاً هنا lnxpps.de/rpie .الاتصال بحافلة CAN للسيارة
بعد دراسة بسيطة للوثائق المفتوحة على حافلة VW CAN ، اكتشفت أنني أستخدم حافلتين.ناقل CAN لوحدة الطاقة ، الذي ينقل البيانات بسرعة 500 كيلوبت / ثانية ، يربط جميع وحدات التحكم التي تخدم هذه الوحدة.على سبيل المثال ، يمكن توصيل الأجهزة التالية بناقل CAN لوحدة الطاقة:- وحدة التحكم في المحرك
- وحدة التحكم ABS
- وحدة التحكم في استقرار الدورة ،
- وحدة تحكم علبة التروس،
- وحدة التحكم في الوسادة الهوائية،
- مجموعة العدادات.
ناقل CAN لنظام الراحة ونظام أوامر المعلومات ، والذي يسمح بنقل البيانات بسرعة 100 كيلوبت / ثانية بين وحدات التحكم التي تخدم هذه الأنظمة.على سبيل المثال ، يمكنتوصيل الأجهزة التالية بناقل CAN لنظام Comfort ونظام المعلومات <command :- وحدة تحكم مناخية أو نظام تكييف هواء ،
- وحدات التحكم في أبواب السيارة ،
- وحدة التحكم في نظام الراحة ،
- وحدة تحكم مع شاشة عرض لنظام الراديو والملاحة.
الوصول إلى أول واحد يمكنك التحكم في حركة المرور (في إصداري على الميكانيكا ، يمكنك على الأقل التحكم في التحكم في السرعة) ، والوصول إلى الثاني يمكنك التحكم في الراديو ، والمناخ ، والقفل المركزي ، ونوافذ الطاقة ، والمصابيح الأمامية ، وما إلى ذلك.يتم توصيل الحافلتين من خلال البوابة ، التي تقع في المنطقة الموجودة أسفل عجلة القيادة ، موصل OBD2 التشخيصي متصل أيضًا بالبوابة ، وللأسف لا يمكن سماع حركة المرور من الحافلتين من خلال موصل OBD2 ، يمكنك فقط إرسال أمر وطلب حالة. قررت أن أعمل فقط مع حافلة الراحة ، واتضح أن الموصل الموجود في باب السائق هو المكان الأكثر ملاءمة للاتصال بالحافلة.
يمكنني الآن الاستماع إلى كل ما يحدث في Comfort CAN وإرسال الأوامر.تطوير الشم ودراسة بروتوكول ناقل CAN
بعد الوصول إلى الاستماع إلى ناقل CAN ، أحتاج إلى فك تشفير من يمر إلى من وماذا. يظهر تنسيق حزمة CAN في الشكل.
جميع الأدوات المساعدة من مجموعة can-utils نفسها قادرة على تحليل حزم CAN وتقديم معلومات مفيدة فقط ، وهي:يتم إرسال البيانات في شكل غير مشفر ، مما سهل دراسة البروتوكول. في Raspberry Pi ، كتبت خادمًا صغيرًا يعيد توجيه البيانات من candump إلى TCP / IP لتحليل تدفق البيانات على الكمبيوتر وإظهاره بشكل جميل.بالنسبة لنظام macOS ، كتبت تطبيقًا بسيطًا يضيف لكل عنوان جهاز خلية إلى الجهاز اللوحي وفي هذه الخلية يمكنني بالفعل رؤية البيانات التي تتغير.
أضغط على زر نافذة الطاقة ، ووجدت خلية تتغير فيها البيانات ، ثم حددت الأوامر التي تتوافق مع الضغط لأسفل ، والضغط لأعلى ، وعقد ، واستمرار.يمكنك التحقق من أن الأمر يعمل عن طريق إرساله من الجهاز ، على سبيل المثال ، الأمر لرفع الزجاج الأيسر لأعلى:cansend can0 181
الفرق التي تنقل الأجهزة عبر ناقل CAN في سيارات VAG (Skoda Octavia 2011) ، يتم تلقيها عن طريق الهندسة العكسية:
181#0200
181#0800
181#2000
181#8000
181#0002
181#0008
181#0020
181#0080
291#09AA020000
291#0955040000
291#0900000000
لقد كنت كسولًا جدًا لدراسة جميع الأجهزة الأخرى ، لذلك في هذه القائمة ، فقط ما كان مثيرًا للاهتمام بالنسبة لي.تطوير تطبيق الهاتف
باستخدام الأوامر المستلمة ، كتبت تطبيقًا لـ iPhone يفتح / يغلق النوافذ ويتحكم في القفل المركزي.على Raspberry Pi I أطلقت خادمين صغيرين ، يرسل الأول البيانات من candump إلى TCP / IP ، والثاني يتلقى أوامر من iPhone ويرسلها يمكن إرسالها.
مصادر تطبيق التحكم التلقائي لنظام التشغيل iOS
#import "FirstViewController.h"
#import "DataConnection.h"
#import "CommandConnection.h"
@interface FirstViewController () <DataConnectionDelegate>
@property (nonatomic, strong) DataConnection *dataConnection;
@property (nonatomic, strong) CommandConnection *commandConnection;
@property (weak, nonatomic) IBOutlet UILabel *Door_1;
@property (weak, nonatomic) IBOutlet UILabel *Door_2;
@property (weak, nonatomic) IBOutlet UILabel *Door_3;
@property (weak, nonatomic) IBOutlet UILabel *Door_4;
@property (weak, nonatomic) IBOutlet UIButton *CentralLock;
- (IBAction)lockUnlock:(UIButton *)sender;
@end
@implementation FirstViewController
- (void)viewDidLoad {
self.dataConnection = [DataConnection new];
self.dataConnection.delegate = self;
[self.dataConnection connectToCanBus];
self.commandConnection = [CommandConnection new];
[self.commandConnection connectToCanBus];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
}
- (void)doorStatusChanged:(char)value {
if (value & 1) {
self.Door_1.backgroundColor = [UIColor yellowColor];
self.Door_1.text = @"";
NSLog(@"1");
}
else {
self.Door_1.backgroundColor = [UIColor lightGrayColor];
self.Door_1.text = @"";
}
if (value & 2) {
self.Door_2.backgroundColor = [UIColor yellowColor];
self.Door_2.text = @"";
NSLog(@"2");
}
else {
self.Door_2.backgroundColor = [UIColor lightGrayColor];
self.Door_2.text = @"";
}
if (value & 4) {
self.Door_3.backgroundColor = [UIColor yellowColor];
self.Door_3.text = @"";
NSLog(@"4");
}
else {
self.Door_3.backgroundColor = [UIColor lightGrayColor];
self.Door_3.text = @"";
}
if (value & 8) {
self.Door_4.backgroundColor = [UIColor yellowColor];
self.Door_4.text = @"";
NSLog(@"8");
}
else {
self.Door_4.backgroundColor = [UIColor lightGrayColor];
self.Door_4.text = @"";
}
}
BOOL firstStatusChange = YES;
BOOL lastStatus;
-(void) centralLockStatusChanged:(BOOL)status {
if (firstStatusChange) {
firstStatusChange = NO;
lastStatus = !status;
}
if (!(lastStatus == status)) {
if (status) {
[self.CentralLock setBackgroundImage:[UIImage imageNamed:@"lock_close"] forState:UIControlStateNormal];
}
else {
[self.CentralLock setBackgroundImage:[UIImage imageNamed:@"lock_open"] forState:UIControlStateNormal];
}
lastStatus = status;
}
}
- (IBAction)frontLeftUp:(UIButton *)sender {
[self.commandConnection sendMessage:@"cansend can0 181#0200"];
}
- (IBAction)frontLeftDown:(id)sender {
[self.commandConnection sendMessage:@"cansend can0 181#0800"];
}
- (IBAction)frontRightUp:(UIButton *)sender {
[self.commandConnection sendMessage:@"cansend can0 181#2000"];
}
- (IBAction)frontRightDown:(id)sender {
[self.commandConnection sendMessage:@"cansend can0 181#8000"];
}
- (IBAction)backLeftUp:(UIButton *)sender {
[self.commandConnection sendMessage:@"cansend can0 181#0002"];
}
- (IBAction)backLeftDown:(id)sender {
[self.commandConnection sendMessage:@"cansend can0 181#0008"];
}
- (IBAction)backRightUp:(UIButton *)sender {
[self.commandConnection sendMessage:@"cansend can0 181#0020"];
}
- (IBAction)backtRightDown:(id)sender {
[self.commandConnection sendMessage:@"cansend can0 181#0080"];
}
- (IBAction)lockUnlock:(UIButton *)sender {
if (lastStatus) {
[self.commandConnection sendMessage:@"cansend can0 291#09AA020000"];
int64_t delayInSeconds = 1;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
[self.commandConnection sendMessage:@"cansend can0 291#0900000000"];
});
}
else {
[self.commandConnection sendMessage:@"cansend can0 291#0955040000"];
int64_t delayInSeconds = 1;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
[self.commandConnection sendMessage:@"cansend can0 291#0900000000"];
});
}
}
@end
هناك طريقة لا لكتابة تطبيقك للهاتف ، ولكن للاستفادة من الجاهز الجاهز من عالم المنازل الذكية ، ما عليك سوى تثبيت نظام التشغيل الآلي Z-Way على أمر Raspberry Pi :wget -q -O - razberry.z-wave.me/install | sudo bash
بعد ذلك ، نضيف أجهزة CAN إلى نظام التشغيل الآلي Z-Way ، ونتحكم
في
منظم النوافذ كمفتاح عادي: تطبيقات الهاتف المحمول لـ Z-Way: ZWay Home Control و ZWay Control.التحكم الصوتي مع Homekit و Siri
في إحدى مقالاتي ، وصفت عملية تثبيت Homebridge على Raspberry Pi للتحكم الصوتي في نظام أتمتة المنزل Z-Way . بعد تثبيت Homebridge ، ستتمكن من التحكم الصوتي باستخدام Siri. أنا متأكد من أنه بالنسبة لنظام Android ، هناك العديد من التطبيقات التي تسمح للصوت بإرسال طلبات HTTP للتحكم في Z-Way.أرفق الفيديو إلى التحكم الصوتي لمنظم النوافذ.