Πίνακας περιεχομένων:

Προσαρμοσμένο Arduino για διατήρηση κουμπιών τιμονιού με νέο στερεοφωνικό αυτοκινήτου: 9 βήματα (με εικόνες)
Προσαρμοσμένο Arduino για διατήρηση κουμπιών τιμονιού με νέο στερεοφωνικό αυτοκινήτου: 9 βήματα (με εικόνες)

Βίντεο: Προσαρμοσμένο Arduino για διατήρηση κουμπιών τιμονιού με νέο στερεοφωνικό αυτοκινήτου: 9 βήματα (με εικόνες)

Βίντεο: Προσαρμοσμένο Arduino για διατήρηση κουμπιών τιμονιού με νέο στερεοφωνικό αυτοκινήτου: 9 βήματα (με εικόνες)
Βίντεο: LDmicro 13: HC-05 Bluetooth Phone App Control (Microcontroller PLC Ladder Programming with LDmicro) 2024, Ιούλιος
Anonim
Προσαρμοσμένο Arduino για διατήρηση κουμπιών τιμονιού με νέο στερεοφωνικό αυτοκινήτου
Προσαρμοσμένο Arduino για διατήρηση κουμπιών τιμονιού με νέο στερεοφωνικό αυτοκινήτου
Προσαρμοσμένο Arduino για διατήρηση κουμπιών τιμονιού με νέο στερεοφωνικό αυτοκινήτου
Προσαρμοσμένο Arduino για διατήρηση κουμπιών τιμονιού με νέο στερεοφωνικό αυτοκινήτου
Προσαρμοσμένο Arduino για διατήρηση κουμπιών τιμονιού με νέο στερεοφωνικό αυτοκινήτου
Προσαρμοσμένο Arduino για διατήρηση κουμπιών τιμονιού με νέο στερεοφωνικό αυτοκινήτου

Αποφάσισα να αντικαταστήσω το αρχικό στερεοφωνικό αυτοκινήτου στο Volvo V70 -02 με ένα νέο στερεοφωνικό, ώστε να μπορώ να απολαμβάνω πράγματα όπως mp3, bluetooth και handsfree.

Το αυτοκίνητό μου έχει κάποια χειριστήρια τιμονιού για το στερεοφωνικό που θα ήθελα να εξακολουθώ να μπορώ να χρησιμοποιώ. Δεν περίμενα ότι αυτό θα ήταν πρόβλημα γιατί υπάρχουν αρκετοί προσαρμογείς στην αγορά που υποτίθεται ότι είναι συμβατοί με το αυτοκίνητό μου. Ωστόσο σύντομα διαπίστωσα ότι δεν ήταν! (Φαίνεται ότι οι προσαρμογείς για V70 μπορεί να έχουν προβλήματα με -02 αυτοκίνητα λόγω ελαφρώς διαφορετικού CAN πρωτοκόλλου.)

Τι να κάνουμε λοιπόν; Διατηρήστε το παλιό στερεοφωνικό; Ζείτε μια ζωή με κουμπιά που δεν λειτουργούν; Φυσικά και όχι! Εάν δεν υπάρχει προσαρμογέας εργασίας στην αγορά, τότε θα πρέπει να φτιάξουμε έναν!

Αυτό το οδηγό μπορεί να εφαρμοστεί (με ορισμένες προσαρμογές) σε αυτοκίνητα όπου τα κουμπιά του τιμονιού επικοινωνούν μέσω του διαύλου CAN.

Βήμα 1: Μάθετε πώς μπορείτε να στείλετε εντολές στο στερεοφωνικό

Μάθετε πώς μπορείτε να στείλετε εντολές στο στερεοφωνικό
Μάθετε πώς μπορείτε να στείλετε εντολές στο στερεοφωνικό
Μάθετε πώς μπορείτε να στείλετε εντολές στο στερεοφωνικό
Μάθετε πώς μπορείτε να στείλετε εντολές στο στερεοφωνικό

Το πρώτο πράγμα που πρέπει να κάνετε είναι να μάθετε τι είδους απομακρυσμένη είσοδο περιμένει το στερεοφωνικό. Συνήθως οι κατασκευαστές δεν θα σας το πουν αυτό και πιθανότατα δεν έχετε πρόσβαση ούτε σε τηλεχειριστήρια εργασίας για αντίστροφη μηχανική.

Το τηλεχειριστήριο για το νέο μου στερεοφωνικό (Kenwood) αποτελείται από ένα μόνο καλώδιο και δεν μπόρεσα να μάθω καμία πληροφορία για το πώς λειτουργεί. Ωστόσο, διαθέτει επίσης υποδοχή 3,5 mm για απομακρυσμένη είσοδο. Ούτε εγώ μπορούσα να μάθω τίποτα για αυτό. Υπάρχουν όμως κάποιες πληροφορίες για μια υποδοχή 3,5 mm για άλλες μάρκες που υποδηλώνουν ότι εντοπίζονται διαφορετικές εντολές εφαρμόζοντας μια συγκεκριμένη αντίσταση μεταξύ του άκρου και του χιτωνίου (και προαιρετικά μεταξύ δακτυλίου και μανικιού). Π.χ. https://forum.arduino.cc/index.php?topic=230068.0. Έτσι αποφάσισα να δοκιμάσω, εξοπλισμένο με ένα breadboard, μια δέσμη αντιστάσεων και ένα βύσμα 3,5 mm συνδεδεμένο στο στερεοφωνικό και συνδεδεμένο με το breadboard. Τίποτα δεν αναγνωρίστηκε στην αρχή, αλλά το στερεοφωνικό έχει ένα μενού "λειτουργία εκμάθησης" και εκεί οι εντολές θα μπορούσαν να ρυθμιστούν με επιτυχία ενώ εφαρμόζετε διάφορες αντιστάσεις. Επιτυχία!

Ωστόσο, αργότερα ανακάλυψα ότι έκανα ένα λάθος εδώ: Δεν θα λειτουργούσαν όλες οι εντολές που φαινόταν να μαθαίνει το στερεοφωνικό. Π.χ. Βρέθηκαν 30 kOhm στη λειτουργία εκμάθησης αλλά δεν λειτούργησαν αργότερα και για μερικές από τις εντολές που έθεσα η διαφορά αντίστασης ήταν τόσο μικρή που αργότερα ενεργοποιήθηκε η λανθασμένη εντολή.

Σας προτείνω λοιπόν να χρησιμοποιήσετε ένα breadboard με αντιστάσεις και κουμπιά εναλλαγής για όλες τις απομακρυσμένες εντολές που θέλετε να χειριστείτε και να δοκιμάσετε ότι όλες θα λειτουργήσουν.

Εάν το στερεοφωνικό του αυτοκινήτου σας δεν μπορεί να λάβει είσοδο με τον ίδιο τρόπο, τότε θα πρέπει να καταλάβετε πώς λειτουργεί, ώστε να μπορείτε να προσαρμόσετε αυτήν τη λύση. Εάν δεν μπορείτε να το καταλάβετε καθόλου, τότε έχετε πρόβλημα.

Βήμα 2: Μάθετε πού να συνδεθείτε στο δίαυλο CAN

Μάθετε πού να συνδεθείτε στο λεωφορείο CAN
Μάθετε πού να συνδεθείτε στο λεωφορείο CAN

Πρέπει να εντοπίσετε ένα καλό μέρος για να συνδεθείτε στο λεωφορείο CAN. Δεδομένου ότι αντικαθιστάτε ένα παλιό στερεοφωνικό που επικοινωνεί μέσω CAN, θα πρέπει να μπορείτε να το βρείτε πίσω από το στερεοφωνικό. Ο δίαυλος CAN αποτελείται από ένα ζεύγος στριμμένων καλωδίων (CAN-L και CAN_H). Συμβουλευτείτε ένα διάγραμμα καλωδίωσης για το αυτοκίνητό σας για να είστε σίγουροι.

Βήμα 3: Αντίστροφη μηχανική των μηνυμάτων CAN

Αντίστροφη Μηχανική μηνυμάτων CAN
Αντίστροφη Μηχανική μηνυμάτων CAN

Εκτός εάν η Google μπορεί να σας πει ποια μηνύματα CAN πρέπει να ακούσετε, τότε θα χρειαστεί να συνδεθείτε στο δίαυλο CAN και να κάνετε αντίστροφη μηχανική. Χρησιμοποίησα ένα Arduino Uno και μια ασπίδα CAN. (Δεν χρειάζεστε πραγματικά την ασπίδα CAN, όπως θα δείτε αργότερα μπορείτε να χρησιμοποιήσετε κάποια φθηνά εξαρτήματα σε ένα breadboard.)

Συμβουλευτείτε την Google για να μάθετε τι ποσοστό baud πρέπει να χρησιμοποιήσετε κατά τη σύνδεση στο αυτοκίνητό σας. (Συνήθως θα διαπιστώσετε ότι υπάρχει δίκτυο υψηλής ταχύτητας και χαμηλής ταχύτητας CAN. Συνδέεστε στο δίκτυο χαμηλής ταχύτητας.)

Θα χρειαστεί επίσης να προγραμματίσετε το Arduino να καταγράφει όλα τα μηνύματα CAN μέσω της σειριακής διεπαφής, ώστε να μπορείτε να τα αποθηκεύσετε σε ένα αρχείο καταγραφής στον υπολογιστή σας. Το τυπικό Arduino IDE δεν θα αποθηκεύσει δεδομένα σε αρχείο καταγραφής, αλλά μπορείτε να χρησιμοποιήσετε π.χ. Στόκος αντ 'αυτού.

Πριν ξεκινήσετε να γράφετε το πρόγραμμά σας, πρέπει να εγκαταστήσετε τη βιβλιοθήκη CAN_BUS_Shield.

Ακολουθούν μερικοί ψευδοκώδικες που θα σας βοηθήσουν να ξεκινήσετε με το πρόγραμμά σας:

εγκατάσταση ()

{init σειριακή σύνδεση init CAN βιβλιοθήκη} βρόχος () {αν λάβει το μήνυμα CAN {διαβάστε την καταχώρηση μορφής μηνύματος CAN μηνύματος εγγραφής καταχώρησης καταγραφής σε σειριακό}}

Συμβουλές:

Θα χρησιμοποιήσετε ένα παράδειγμα της κλάσης MCP_CAN για να αποκτήσετε πρόσβαση στη λειτουργία βιβλιοθήκης CAN:

MCP_CAN m_can;

Init CAN:

ενώ (m_can.begin ()! = CAN_OK)

{καθυστέρηση (1000); }

Ελέγξτε και διαβάστε CAN μηνύματα:

ενώ (m_can.checkReceive () == CAN_MSGAVAIL)

{// Λήψη CAN id, μήκος μηνύματος και δεδομένα μηνύματος m_can.readMsgBufID (& m_canId, & m_msgLen, m_msgBuf); // Κάντε κάτι με τα δεδομένα του μηνύματος εδώ}

Εάν χρειάζεστε περισσότερη βοήθεια, μπορείτε να βρείτε έναν σύνδεσμο για το πρόγραμμά μου σε μεταγενέστερο βήμα. Η βιβλιοθήκη CAN shield περιλαμβάνει επίσης ένα παράδειγμα. Or ελέγξτε τις οδηγίες του mviljoen2 που περιλαμβάνουν παρόμοιο βήμα.

Πρώτα θα χρειαστείτε ένα αρχείο αναφοράς για να σας βοηθήσει να φιλτράρετε τα δεδομένα. Αλλάξτε την ανάφλεξη στη λειτουργία ραδιοφώνου και καταγράψτε τα πάντα για μερικά λεπτά χωρίς να αγγίξετε κανένα κουμπί.

Στη συνέχεια, για καθένα από τα κουμπιά, ξεκινήστε την καταγραφή, πατήστε το κουμπί και σταματήστε την καταγραφή.

Όταν τελειώσετε, πρέπει να φιλτράρετε όλα όσα βρίσκονται στο αρχείο καταγραφής αναφοράς από τα αρχεία καταγραφής κουμπιών για να βρείτε τους υποψηφίους σας. Διαπίστωσα ότι είχαν απομείνει πολλά μηνύματα, οπότε έκανα περισσότερα αρχεία καταγραφής και στη συνέχεια απαίτησα ότι "οι υποψήφιοι για την εντολή Α πρέπει να βρίσκονται σε όλα τα κουμπιά-Α-αρχεία και σε κανένα από τα αρχεία αναφοράς". Αυτό μου άφησε μόνο μερικές δυνατότητες να δοκιμάσω.

Τα αρχεία καταγραφής θα περιέχουν πολλά μηνύματα, οπότε θα χρειαστεί να γράψετε κάποιο πρόγραμμα για αυτό ή ενδεχομένως να χρησιμοποιήσετε το Excel. (Χρησιμοποίησα ένα πρόγραμμα με πολύ σκληρές κωδικοποιημένες συνθήκες για τις ανάγκες μου, οπότε φοβάμαι ότι δεν μπορώ να προσφέρω ένα πρόγραμμα που μπορείτε να χρησιμοποιήσετε.)

Μια προειδοποίηση: Δεν μπορείτε να είστε σίγουροι ότι ένα κουμπί θα παράγει πάντα το ίδιο μήνυμα. Μερικά από τα δυαδικά ψηφία μπορεί να περιέχουν αυξανόμενους μετρητές κ.λπ. (Μπορείτε ωστόσο να μην το ίδιο το αναγνωριστικό μηνύματος.)

Εάν τυχαίνει να έχετε ένα Volvo V70 -02, αυτό είναι που ψάχνετε:

  • Αναγνωριστικό μηνύματος: 0x0400066Byte0: 0x00, 0x40, 0x80 ή 0xc0 (δεν με νοιάζει)
  • Byte1: 0x00 (δεν με νοιάζει)
  • Byte2: 0x00 (δεν με νοιάζει)
  • Byte3: 0x00-0x07 (δεν με νοιάζει)
  • Byte4: 0x1f (δεν με νοιάζει)
  • Byte5: 0x40 (δεν με νοιάζει)
  • Byte6: 0x40 (δεν με νοιάζει)
  • Byte7: Αναγνωριστικό κουμπιού: 0x77 = αύξηση της έντασης, 0x7b = μείωση της έντασης, 0x7d = επόμενο κομμάτι, 0x7e = προηγούμενο κομμάτι.

Όταν πιστεύετε ότι έχετε βρει τις εντολές, θα ήταν καλή ιδέα να τροποποιήσετε το πρόγραμμα έτσι ώστε να καταγράφει μόνο τα ενδιαφέροντα μηνύματα. Κοιτάξτε το παράθυρο σειριακής καταγραφής ενώ πατάτε τα κουμπιά για να επαληθεύσετε ότι έχετε εντοπίσει τα σωστά μηνύματα.

Βήμα 4: Το πρωτότυπο υλικού

Το πρωτότυπο υλικού
Το πρωτότυπο υλικού

Το υλικό σας πρέπει να είναι σε θέση να:

  1. Προσδιορίστε τις εντολές που λαμβάνονται στο δίαυλο CAN
  2. Αποστολή εντολών σε άλλη μορφή στο στερεοφωνικό

Εάν έχετε αρκετό χώρο, μπορείτε να χρησιμοποιήσετε ένα Arduino και μια ασπίδα CAN για το πρώτο μέρος και να επισυνάψετε κάποιο πρόσθετο υλικό για το δεύτερο. Ωστόσο, υπάρχουν ορισμένα μειονεκτήματα:

  • Κόστος της ασπίδας CAN
  • Μέγεθος
  • Το τροφοδοτικό Arduino δεν θα είναι ευχάριστο αν συνδεθεί απευθείας στα αυτοκίνητά σας 12V (πιθανότατα θα λειτουργήσει, αλλά η ζωή του πιθανότατα θα μειωθεί).

Αντ 'αυτού, χρησιμοποίησα τα ακόλουθα:

  • Atmega 328, ο «εγκέφαλος Arduino». (Υπάρχουν μερικές παραλλαγές, πάρτε αυτή που είναι ίση με αυτήν στο Arduino Uno. Μπορείτε να το αγοράσετε με ή χωρίς φορτωτή εκκίνησης Arduino.)
  • Κρυστάλλος 16 MHz + πυκνωτές για σήμα ρολογιού.
  • Πομποδέκτης MCP2551 CAN.
  • MCP2515 CAN ελεγκτής.
  • TSR1-2450, μετατρέπει 6,5-36V σε 5V. (Δεν χρησιμοποιείται στο πρωτότυπο επειδή το λογισμικό δεν θα ενδιαφέρεται για την παροχή ρεύματος.)
  • Διακόπτης CD4066B που θα χρησιμοποιηθεί κατά την αποστολή εντολών στο στερεοφωνικό.
  • Ένα ζευγάρι αντιστάσεων. (Οι τιμές μπορούν να βρεθούν στα σχήματα του Αετού σε μεταγενέστερο βήμα.)

Ένα καλό με αυτήν τη διαμόρφωση είναι ότι είναι πλήρως συμβατό με το Arduino και τη βιβλιοθήκη CAN shield.

Εάν θέλετε να χειριστείτε περισσότερα από τέσσερα κουμπιά, ίσως θελήσετε να χρησιμοποιήσετε κάτι άλλο από το CD4066B. Το CD4066B μπορεί να περιγραφεί ως τέσσερις διακόπτες σε έναν, ο καθένας που ελέγχεται από έναν από τους ακροδέκτες GPIO του Atmegas. Σε κάθε διακόπτη υπάρχει μια αντίσταση συνδεδεμένη που μπορεί να χρησιμοποιηθεί για τον έλεγχο της αντίστασης που χρησιμοποιείται ως είσοδος στο στερεοφωνικό. Αυτό λοιπόν μπορεί εύκολα να χρησιμοποιηθεί για την αποστολή τεσσάρων διαφορετικών εντολών. Εάν συνδυάζονται τότε μπορούν να ληφθούν πρόσθετες τιμές αντίστασης. Εδώ έρχεται το λάθος που ανέφερα νωρίτερα. Έχω τέσσερα κουμπιά, αλλά σχεδίαζα να εφαρμόσω δύο από αυτά τόσο μακρύ όσο και σύντομο πάτημα για να μου δώσουν έξι διαφορετικές εντολές. Αλλά στο τέλος ανακάλυψα ότι δεν μπορούσα να βρω έναν συνδυασμό αντιστάσεων που θα μου έδινε έξι συνδυασμούς εργασίας. Θα μπορούσε πιθανώς να συνδεθεί ένα αναλογικό σήμα εξόδου στο στερεοφωνικό (άκρη 3,5 mm). (Σημειώστε ότι το Atmega δεν έχει πραγματικούς αναλογικούς ακροδέκτες, οπότε θα χρειαζόταν κάποιο πρόσθετο υλικό.)

Για λόγους δοκιμής, έφτιαξα επίσης έναν απλό προσομοιωτή "αυτοκινήτου και στερεοφωνικού" για να συνδεθώ στο πρωτότυπό μου. Διευκολύνει τον εντοπισμό σφαλμάτων και αν δεν σας αρέσει να κάθεστε στο αυτοκίνητο και το πρόγραμμα σας, μπορώ να το συστήσω.

Το πρωτότυπο απεικονίζεται από την κάτω πλάκα ψωμιού στην εικόνα. Για τροφοδοσία, προγραμματισμό και σειριακή καταγραφή συνδέεται με ένα Arduino Uno όπου έχει αφαιρεθεί το τσιπ Atmega.

Ο επάνω πίνακας είναι ο προσομοιωτής αυτοκινήτου + στερεοφωνικού που θα χρησιμοποιηθεί για την αρχική δοκιμή του πρωτοτύπου.

Το πρωτότυπο + προσομοιωτής προορίζεται να λειτουργήσει ως εξής:

  • Πατήστε ένα από τα κουμπιά διακόπτη στην πλακέτα προσομοιωτή. (Αυτά είναι τα κουμπιά του τιμονιού σας.)
  • Όταν το πρόγραμμα προσομοιωτή ανιχνεύσει ένα κουμπί, θα στείλει το αντίστοιχο μήνυμα CAN κάθε 70 ms εφόσον πατηθεί το κουμπί. (Επειδή τα αρχεία καταγραφής που έκανα νωρίτερα έδειχναν πώς λειτουργεί στο αυτοκίνητό μου.) Θα στείλει επίσης πολλά "ανεπιθύμητα" μηνύματα CAN για να προσομοιώσει άλλη κίνηση στο λεωφορείο.
  • Τα μηνύματα CAN αποστέλλονται στο δίαυλο CAN.
  • Τα μηνύματα CAN λαμβάνονται από το πρωτότυπο.
  • Το MCP2515 ρίχνει όλα τα άσχετα μηνύματα με βάση το αναγνωριστικό μηνύματος.
  • Όταν το MCP2515 λάβει ένα μήνυμα που πρέπει να χειριστεί, θα υποδείξει ότι έχει ένα μήνυμα ενθυλακωμένο.
  • Το Atmega θα διαβάσει το μήνυμα και θα αποφασίσει ποιο κουμπί πρέπει να θεωρηθεί ενεργό.
  • Το Atmega θα παρακολουθεί επίσης πότε ελήφθη το τελευταίο μήνυμα, μετά από κάποιο χρονικό διάστημα το κουμπί θα θεωρείται απελευθερωμένο. (Τα μηνύματα CAN υποδεικνύουν μόνο ότι ένα κουμπί είναι κατεβασμένο και όχι ότι έχει πατηθεί ή απελευθερωθεί.)
  • Εάν ένα κουμπί θεωρηθεί ενεργό, τότε ένας ή περισσότεροι διακόπτες στο CD4066B θα ενεργοποιηθούν.
  • Ο προσομοιωτής (τώρα λειτουργεί ως στερεοφωνικό σας) θα ανιχνεύσει ότι εφαρμόζεται αντίσταση μεταξύ άκρου και μανικιού. (Το άκρο είναι συνδεδεμένο σε 3.3V και μέσω αντίστασης σε αναλογικό πείρο εισόδου. Όταν καμία εντολή δεν είναι ενεργή, αυτός ο πείρος θα διαβάζει 3.3V, όταν μια εντολή είναι ενεργή, η τιμή θα μειωθεί και θα προσδιορίσει την εντολή.
  • Ενώ μια εντολή είναι ενεργή, το αντίστοιχο led θα ενεργοποιηθεί επίσης. (Υπάρχουν έξι led επειδή σχεδίαζα να χρησιμοποιήσω διαφορετικό μακρύ / σύντομο πάτημα για δύο κουμπιά μου.)

Για περισσότερες λεπτομέρειες σχετικά με το πρωτότυπο υλικό, ανατρέξτε στα σχήματα του Eagle σε μεταγενέστερο βήμα.

Πρόσθετες λεπτομέρειες σχετικά με το υλικό της πλακέτας προσομοιωτή:

  • Κρύσταλλο 16 MHz
  • Πυκνωτές 22 pF
  • Οι αντιστάσεις LED πρέπει να επιλέγονται με βάση τις ιδιότητες των LED
  • Αντίσταση συνδεδεμένη σε A7 και 3.3V, επιλέξτε π.χ. 2kOhm (δεν είναι κρίσιμο).
  • Οι αντιστάσεις που είναι συνδεδεμένες στα MCP2551 και MCP2515 είναι pull-up / pull-down. Επιλέξτε π.χ. 10 kOhm

(Or μπορείτε να χρησιμοποιήσετε την ασπίδα CAN για το "μέρος CAN" του προσομοιωτή, αν προτιμάτε.)

Είναι σημαντικό να γνωρίζετε πώς αντιστοιχίζονται οι καρφίτσες Atmega στις καρφίτσες Arduino όταν σχεδιάζετε το υλικό.

(Μην συνδέετε κανένα led απευθείας στο CD 4066B, μπορεί να χειριστεί μόνο χαμηλό ρεύμα. Το προσπάθησα όταν δοκίμασα για πρώτη φορά την έξοδο και το τσιπ έγινε άχρηστο. Το καλό είναι ότι είχα αγοράσει μερικά από αυτά μόνο και μόνο επειδή είναι τόσο φθηνά.)

Βήμα 5: Προγραμματισμός ασφαλειών

Maybeσως παρατηρήσατε στο προηγούμενο βήμα ότι το πρωτότυπο δεν έχει ξεχωριστά εξαρτήματα για τη δημιουργία σήματος ρολογιού στο MCP2515. Αυτό συμβαίνει επειδή υπάρχει ήδη ένας κρύσταλλος 16 MHz που χρησιμοποιείται ως σήμα ρολογιού Atmega που μπορούμε να χρησιμοποιήσουμε. Αλλά δεν μπορούμε απλά να το συνδέσουμε απευθείας με το MCP2515 και από προεπιλογή δεν υπάρχει σήμα λήξης ρολογιού στο Atmega.

(Εάν προτιμάτε, μπορείτε να παραλείψετε αυτό το βήμα και να προσθέσετε το επιπλέον υλικό ρολογιού.)

Ωστόσο, μπορούμε να χρησιμοποιήσουμε κάτι που ονομάζεται "προγραμματισμός ασφαλειών" για να ενεργοποιήσουμε ένα σήμα λήξης ρολογιού σε έναν από τους ακροδέκτες GPIO.

Πρώτα θα χρειαστεί να εντοπίσετε ένα αρχείο με το όνομα "boards.txt" που χρησιμοποιείται από το Arduino IDE. Θα χρειαστεί να αντιγράψετε την καταχώριση για το Arduino Uno, να της δώσετε ένα νέο όνομα και να αλλάξετε την τιμή για τις χαμηλές ασφάλειες.

Ο νέος μου πίνακας μοιάζει με αυτόν:

################################################### #############Με βάση το Arduino Uno#Αλλαγές:#χαμηλές_ασφάλειες άλλαξαν από 0xff σε 0xbf για να ενεργοποιήσουν το ρολόι 16 MHz#out στο Atmega PB0/pin 14 = Arduino D8

clkuno.name = Clock out (Arduino Uno)

clkuno.upload.protocol = arduino clkuno.upload.maximum_size = 32256 clkuno.upload.speed = 115200 clkuno.bootloader.low_fuses = 0xbf clkuno.bootloader.high_fuses = 0xde clkuno.bootloadererxexet.bootloader.file = optiboot_atmega328.hex clkuno.bootloader.unlock_bits = 0xff clkuno.bootloader.lock_bits = 0xcf clkuno.build.mcu = atmega328p clkuno.build.f_cpu = 16000000L clkunobuild.build = cl.

##############################################################

Σημειώστε ότι το ρολόι εξόδου ενεργοποιείται ρυθμίζοντας το bit ελέγχου του στο 0.

Όταν δημιουργήσετε τον νέο πίνακα στο αρχείο διαμόρφωσης των πλακέτων, θα πρέπει να εγγράψετε έναν νέο φορτωτή εκκίνησης στο Atmega. Υπάρχουν διάφοροι τρόποι για να γίνει αυτό, χρησιμοποίησα τη μέθοδο που περιγράφεται στο

Αφού το κάνετε αυτό, θυμηθείτε να επιλέξετε τον νέο τύπο πλακέτας και όχι το Arduino Uno όταν ανεβάζετε ένα πρόγραμμα στο Atmega.

Βήμα 6: Το Λογισμικό

Το λογισμικό
Το λογισμικό

Timeρα να κάνετε το χαζό υλικό έξυπνο προσθέτοντας κάποιο λογισμικό.

Ακολουθούν μερικοί ψευδοκώδικες για το πρωτότυπο:

lastReceivedTime = 0

lastReceivedCmd = κανένα cmdTimeout = 100 setup () {enable watchdog διαμορφώστε τις καρφίτσες D4-D7 ως ακίδες εισόδου init CAN setup CAN filter} loop () {reset resetdag if (CAN message λαμβάνεται) {για κάθε εντολή κουμπιού {if CAN message ανήκει η εντολή κουμπιού {lastReceivedTime = τώρα lastReceivedCmd = cmd}}} αν τώρα> lastReceivedTime + cmdTimeout {lastReceivedCmd = none} για κάθε εντολή κουμπιού {if lastReceivedCmd είναι εντολή κουμπιού {set command command output = on} else {set pin command output output = off }}}

Το cmdTimeout αποφασίζει πόσο καιρό πρέπει να περιμένουμε για να εξετάσουμε το τελευταίο ενεργό κουμπί που κυκλοφόρησε. Επειδή οι εντολές κουμπιού CAN αποστέλλονται περίπου κάθε 70 ms, πρέπει να είναι μεγαλύτερες από αυτές με κάποιο περιθώριο. Αλλά αν είναι πολύ μεγάλο, θα υπάρχει μια εμπειρία καθυστέρησης. Οπότε 100 ms φαίνεται καλός υποψήφιος.

Τι είναι όμως φύλακας; Είναι μια χρήσιμη μικρή δυνατότητα υλικού που μπορεί να μας σώσει σε περίπτωση συντριβής. Φανταστείτε ότι έχουμε ένα σφάλμα που προκαλεί την κατάρρευση του προγράμματος ενώ η εντολή αύξησης της έντασης είναι ενεργή. Τότε θα καταλήγαμε με το στερεοφωνικό σε μέγιστη ένταση! Αλλά εάν ο φύλακας δεν επαναρυθμιστεί για τη συγκεκριμένη χρονική στιγμή, θα αποφασίσει ότι έχει συμβεί κάτι απροσδόκητο και θα εκδώσει απλώς μια επαναφορά.

void setup ()

{// επιτρέψτε έως και 250 ms για τον βρόχο wdt_enable (WDTO_250MS). // άλλα init stuff} void loop () {wdt_reset (); // κάνω πράγματα }

ΜΠΟΡΕΙ να φιλτράρει; Λοιπόν, μπορείτε να διαμορφώσετε τον ελεγκτή CAN ώστε να απορρίπτει όλα τα μηνύματα που δεν ταιριάζουν με το φίλτρο, ώστε το λογισμικό να μην χρειάζεται να χάνει χρόνο σε μηνύματα που δεν μας ενδιαφέρουν.

ανυπόγραφη μακριά μάσκα = 0x1fffffff; // Συμπεριλάβετε και τα 29 bit κεφαλίδας στη μάσκα

ανυπόγραφο μακρύ φίλτροId = 0x0400066; // Μας ενδιαφέρει μόνο αυτό το αναγνωριστικό CAN μηνύματος m_can.init_Mask (0, CAN_EXTID, μάσκα). // Η μάσκα 0 ισχύει για το φίλτρο 0-1 m_can.init_Mask (1, CAN_EXTID, μάσκα). // Η μάσκα 1 ισχύει για το φίλτρο 2-5 m_can.init_Filt (0, CAN_EXTID, filterId). m_can.init_Filt (1, CAN_EXTID, filterId); m_can.init_Filt (2, CAN_EXTID, filterId); m_can.init_Filt (3, CAN_EXTID, filterId); m_can.init_Filt (4, CAN_EXTID, filterId); m_can.init_Filt (5, CAN_EXTID, filterId);

Ελέγξτε τον κωδικό βιβλιοθήκης CAN και την τεκμηρίωση του ελεγκτή CAN για περισσότερες λεπτομέρειες σχετικά με τον τρόπο ρύθμισης φίλτρου + μάσκας.

Μπορείτε επίσης να ρυθμίσετε τον ελεγκτή CAN για να αυξήσει μια διακοπή όταν λαμβάνεται ένα μήνυμα (που δεν φιλτράρεται). (Δεν περιλαμβάνεται στο παραπάνω παράδειγμα, αλλά υπάρχει κάποιος κώδικας για αυτό στο πρόγραμμά μου.) Σε αυτήν την περίπτωση δεν προσθέτει καμία τιμή και μπορεί να προκαλέσει σύγχυση αν δεν είστε συνηθισμένοι στον προγραμματισμό.

Αυτό ήταν το συνοπτικό πρότυπο λογισμικό. Αλλά χρειαζόμαστε κάποιο κώδικα και για την πλακέτα προσομοιωτή:

lastSentTime = 0

minDelayTime = 70 setup () {διαμορφώστε τους πείρους A0-A5 ως ακροδέκτες εξόδου διαμορφώστε τους πείρους D4-D7 ως ακίδες εισόδου με εσωτερική έλξη. init CAN} loop () {send "junk" can msg set activeButton = κανένα για κάθε κουμπί {if button is pressed {set activeButton = button}} if activeButton! = κανένα {if now> lastSentTime + minDelayTime {send button message can message } set lastSentTime = now} inval = read pin A7 foreach (cmd) {if (min <inval <max) {led on} else {led off}} περιμένετε 1 ms}

Αυτό θα στέλνει συνεχώς "ανεπιθύμητα" μηνύματα CAN περίπου κάθε ms και ενώ πιέζεται ένα κουμπί την αντίστοιχη εντολή κάθε 70 ms.

Mightσως χρειαστεί να καταγράψετε την είσοδο στο pin A7 πατώντας τα διαφορετικά κουμπιά για να μάθετε τις κατάλληλες τιμές για τις ελάχιστες και μέγιστες μεταβλητές που ανήκουν σε κάθε κουμπί. (Or μπορείτε να το υπολογίσετε, αλλά στην πραγματικότητα η ανάγνωση της εισόδου θα σας δώσει ακριβέστερες τιμές.)

Πρέπει να είστε λίγο προσεκτικοί όταν προγραμματίζετε τις λειτουργίες pin. Αν ρυθμίσετε κατά λάθος τους πείρους που προορίζονται να χρησιμοποιούν εσωτερική έλξη ως ακίδες εξόδου, τότε θα δημιουργήσετε μια πιθανή συντόμευση που θα βλάψει το Arduino σας όταν ρυθμίσετε την έξοδο σε υψηλή τιμή.

Αν θέλετε να ελέγξετε τα προγράμματά μου, μπορείτε να τα κατεβάσετε εδώ:

  • Πρόγραμμα καταγραφής μηνυμάτων CAN
  • Πρόγραμμα για την πλακέτα προσομοιωτή
  • Πρόγραμμα για πρωτότυπο / τελικό πίνακα

Θα πρέπει να γνωρίζετε ότι αυτά τα προγράμματα δεν ταιριάζουν πραγματικά με τον ψευδοκώδικα εδώ, περιέχουν πολλά «επιπλέον» πράγματα που δεν χρειάζονται πραγματικά και αν δεν είστε εξοικειωμένοι με τον αντικειμενοστραφή προγραμματισμό, μπορεί να είναι λίγο δύσκολο να διαβαστούν Το

Βήμα 7: Το τελικό υλικό

Το Τελικό Υλικό
Το Τελικό Υλικό
Το Τελικό Υλικό
Το Τελικό Υλικό
Το τελικό υλικό
Το τελικό υλικό

Όταν είστε ευχαριστημένοι με το πρόγραμμά σας (θυμηθείτε να δοκιμάσετε το πρωτότυπο στο αυτοκίνητο μετά την τελική δοκιμή με την πλακέτα προσομοιωτή) είναι καιρός να κατασκευάσετε το πραγματικό υλικό.

Έχετε τρεις επιλογές εδώ:

  • Γρήγορα και βρώμικα - κολλήστε τα πράγματα μαζί σε έναν πίνακα πρωτοτύπων PCB.
  • Hardcore DIY - χαράξτε το δικό σας PCB.
  • Ο τεμπέλης τρόπος - παραγγείλετε ένα επαγγελματικό PCB για να κολλήσει τα εξαρτήματα.

Εάν δεν βιάζεστε, μπορώ να συστήσω την τελευταία επιλογή. Εάν χρειάζεστε μόνο ένα μικρό PCB όπως αυτό, είναι πολύ φθηνό να το παραγγείλετε από την Κίνα. (Και τότε πιθανότατα θα πάρετε δέκα κομμάτια για να μπορέσετε να αντέξετε οικονομικά κάποια λάθη συγκόλλησης.)

Για να παραγγείλετε PCB θα πρέπει να στείλετε το σχέδιό σας σε μορφή Gerber. Υπάρχουν διάφορα λογισμικά για αυτό. Χρησιμοποίησα το Eagle που μπορώ να συστήσω. Μπορείτε να περιμένετε μερικές ώρες για να το μάθετε, αλλά στη συνέχεια λειτουργεί καλά. Για μικρές σανίδες όπως αυτή μπορείτε να το χρησιμοποιήσετε δωρεάν.

Να είστε προσεκτικοί όταν φτιάχνετε το σχέδιο. Δεν θέλετε να περιμένετε τέσσερις εβδομάδες για την παράδοση για να διαπιστώσετε ότι κάνατε κάτι λάθος.

(Εάν έχετε καλές δεξιότητες συγκόλλησης, μπορείτε να σχεδιάσετε για εξαρτήματα επιφανείας και να πάρετε έναν πραγματικά μικρό προσαρμογέα. Δεν το έκανα.)

Στη συνέχεια παραγγείλετε στο π.χ. https://www.seeedstudio.com/fusion_pcb.html. Ακολουθήστε τις οδηγίες για τον τρόπο δημιουργίας των αρχείων Gerber από το σχέδιό σας. Μπορείτε επίσης να λάβετε μια προεπισκόπηση του αποτελέσματος για να βεβαιωθείτε ότι είναι εντάξει.

(Στο τέλος έπρεπε να επιλέξω άλλες αντιστάσεις για το R4-R7 από αυτές που αναφέρονται στην εικόνα. Αντ 'αυτού χρησιμοποίησα 2k, 4.7k, 6.8k και 14.7k.)

Και θυμηθείτε - μην συγχέετε την αρίθμηση των καρφιών Atmega με την αρίθμηση των καρφιών Arduino!

Σας συνιστώ να μην κολλήσετε απευθείας το τσιπ Atmega αλλά να χρησιμοποιήσετε πρίζα. Στη συνέχεια, μπορείτε εύκολα να το αφαιρέσετε σε περίπτωση που χρειαστεί να το επαναπρογραμματίσετε.

Βήμα 8: Τοποθέτηση αυτοκινήτου

Τοποθέτηση αυτοκινήτου
Τοποθέτηση αυτοκινήτου
Τοποθέτηση αυτοκινήτου
Τοποθέτηση αυτοκινήτου

Τώρα στο πιο διασκεδαστικό μέρος - τοποθετήστε το στο αυτοκίνητό σας και ξεκινήστε να το χρησιμοποιείτε! (Αφού έχετε φτιάξει / αγοράσει μια θήκη για αυτό.)

Εάν έχετε ήδη δοκιμάσει πλήρως το πρωτότυπο στο αυτοκίνητό σας, όλα θα πρέπει να λειτουργούν τέλεια.

(Όπως ανέφερα νωρίτερα, δεν έπρεπε, οπότε έπρεπε να αντικαταστήσω κάποιες αντιστάσεις και να κάνω κάποιες αλλαγές στο πρόγραμμά μου.)

Επίσης, σκεφτείτε εάν πρέπει να το τοποθετήσετε πίσω από το στερεοφωνικό ή κάπου αλλού. Βρήκα ένα καλό μέρος πάνω από το ντουλαπάκι μου όπου μπορώ να το φτάσω μέσα από το γάντι χωρίς να χωρίσω τίποτα. Αυτό μπορεί να είναι χρήσιμο εάν αποφασίσω να το αναβαθμίσω αργότερα.

Επιτέλους τα κουμπιά μου λειτουργούν ξανά! Πώς θα μπορούσα να επιβιώσω για δύο μήνες χωρίς αυτούς;

Βήμα 9: Μελλοντικές βελτιώσεις

Όπως αναφέρθηκε, αν φτιάξω μια έκδοση 2.0 αυτού, θα αντικαταστήσω το 4066B με κάτι άλλο (πιθανώς ψηφιακό ποτενσιόμετρο) για μεγαλύτερη ευελιξία.

Υπάρχουν επίσης πολλά άλλα πράγματα που μπορείτε να κάνετε. Π.χ. προσθέστε μια μονάδα bluetooth και δημιουργήστε μια εφαρμογή τηλεχειριστηρίου για το τηλέφωνό σας. Or μια μονάδα GPS, τότε όταν βρίσκεστε κοντά στο σπίτι μπορείτε να αυξήσετε αυτόματα την ένταση και να στείλετε το μήνυμα "παράθυρα προς τα κάτω" CAN, έτσι ώστε όλοι οι γείτονές σας να μπορούν να απολαύσουν την υπέροχη μουσική σας.

Συνιστάται: