Styrenhet av mätare (CANBUS)
Styrenhet av mätare (CANBUS)
Jag har ett bilprojekt där jag uppdaterat en gammal bil med en modernare motor och växellåda. Tanken är att bilen ska ha kvar orginalinredning och alla analoga mätare. Dessa mätare är elektromekaniska och fungerar inte alls med den nya motorn och databoxen.
Jag har konverterat ett gäng mätare till att drivas med en stepper motor av modell X27.168. Dessa drivs av AX1201728SG som har som input antal steps via puls samt en pin som är hög eller låg beroende på vilket håll motorn ska gå.
Jag har provat att köra dessa mätare med en "CANpico", dvs en Raspberry pico med en CANBUS-modul påbyggd. Jag har sedan skrivit python-kod för att läsa av relevanta värden från CANBUS för att sedan räkna ut hur många pulser som behöver skickas till varje drivare för att ställa mätaren rätt. Det fungerar hyffsat bra på långsamma mätare som temperatur och bränslenivå men jag får inte alls till det för snabbare mätare som vartal eller hastighet. Det blir liksom hackigt i rörelserna. Jag antar att Pico blir lite för upptagen att pulsa output till en drivare och då blir dom andra mätarnas rörelser pausade tills processorn blir ledig att ta tag i nästa. Det är totalt 5 mätare - varvtal, hastighet, bränslenivå, oljetryck och temperatur.
Nu gör jag en nystart på det här!
Vad väljer jag för hårdvara för att läsa av CANBUS på 1Mbit (behöver nog kunna filtreras för det är en hel del data som delas) och styra stepper-drivarna?
Behöver jag flera styrkretsar? Jag tänkte att en pico borde kunna styra 5 mätare men jag kanske tänker fel...
Är det python som är för segt för detta? Behöver jag få till det i C?
Jag har lekt lite med PIO i Pico men får inte riktigt till styrningen av drivarna med detta. Är detta kanske lösningen?
Jag har konverterat ett gäng mätare till att drivas med en stepper motor av modell X27.168. Dessa drivs av AX1201728SG som har som input antal steps via puls samt en pin som är hög eller låg beroende på vilket håll motorn ska gå.
Jag har provat att köra dessa mätare med en "CANpico", dvs en Raspberry pico med en CANBUS-modul påbyggd. Jag har sedan skrivit python-kod för att läsa av relevanta värden från CANBUS för att sedan räkna ut hur många pulser som behöver skickas till varje drivare för att ställa mätaren rätt. Det fungerar hyffsat bra på långsamma mätare som temperatur och bränslenivå men jag får inte alls till det för snabbare mätare som vartal eller hastighet. Det blir liksom hackigt i rörelserna. Jag antar att Pico blir lite för upptagen att pulsa output till en drivare och då blir dom andra mätarnas rörelser pausade tills processorn blir ledig att ta tag i nästa. Det är totalt 5 mätare - varvtal, hastighet, bränslenivå, oljetryck och temperatur.
Nu gör jag en nystart på det här!
Vad väljer jag för hårdvara för att läsa av CANBUS på 1Mbit (behöver nog kunna filtreras för det är en hel del data som delas) och styra stepper-drivarna?
Behöver jag flera styrkretsar? Jag tänkte att en pico borde kunna styra 5 mätare men jag kanske tänker fel...
Är det python som är för segt för detta? Behöver jag få till det i C?
Jag har lekt lite med PIO i Pico men får inte riktigt till styrningen av drivarna med detta. Är detta kanske lösningen?
Re: Styrenhet av mätare (CANBUS)
Första steg är nog att byta till C. Python är (även där antar jag) ett intepreterat språk o jag gissar på att du förlorar kanske 60% av CPU-kraften på detta.
Sedan kan det vara att ditt program kanske inte är speciellt "strömlinjeformat", man kan hämta något hastighet på det konto också.
Jag hade lagt upp det till att ta de filtrerade data räknat om till position i steg i var deras variabel.
Sedan har man lika många variabler med vad de olika visare står på <nu> och sedan kan en snabb rutin köra igenom o jämföra positioner med vad de ska vara o ge ut pulser där det behövs.
Sedan kan det vara att ditt program kanske inte är speciellt "strömlinjeformat", man kan hämta något hastighet på det konto också.
Jag hade lagt upp det till att ta de filtrerade data räknat om till position i steg i var deras variabel.
Sedan har man lika många variabler med vad de olika visare står på <nu> och sedan kan en snabb rutin köra igenom o jämföra positioner med vad de ska vara o ge ut pulser där det behövs.
Re: Styrenhet av mätare (CANBUS)
Det finns nog mycket att hämta på att optimera i programmet.
Även att byta till c, men fundera på om det är värt tiden jämfört med att ta en pico var för varvtal och hastighet och en gemensam för de långsammare mätarna.
Även att byta till c, men fundera på om det är värt tiden jämfört med att ta en pico var för varvtal och hastighet och en gemensam för de långsammare mätarna.
Re: Styrenhet av mätare (CANBUS)
Python har många brister, men så segt är det inte. Interpreterade språk använder ofta C-bibliotek under huven för att interagera med systemet och då blir skillnaden minimal. Min erfarenhet är att interpreterade språk är riktigt bra till prototyping eftersom man kan fokusera mer på datastrukturer än detaljer i HW-kommunikation. Det största problemet med i princip alla interpreterade språk är att de har ett interpretatorlås som gör att bara en tråd i taget kan köra interpreterad kod. Det begränsar rätt kraftigt hur mycket man kan dra nytta av modern hårdvara. Så ett byte till C är väl att rekommendera i något läge, men kanske inte på prototypstadiet.
Re: Styrenhet av mätare (CANBUS)
Kul projekt, vad är det för bil? och vad är det för donatormotor? Kommer följa tråden 

Re: Styrenhet av mätare (CANBUS)
Som ni säger så finns det säkert massor att hämta på optimering av programmet. Jag skulle inte säga att jag är proffs på att koda. Jag tycker dock att jag i python har lyckats få fram en hyffsat strömlinjeformat kod som i alla fall inte pausar eller väntar någonstans. När jag har testat har jag endast testat med en fast hastighet på mätarnas rörelse. Om man tittar i moderna bilar där mätarna också styrs via CAN så rör sig mätarna både mjukt och i olika hastighet beroende på rate-of-change. Detta har jag dock inte börjat titta på alls ännu.
Att filtrera vilka CAN-ID som ska hämtas data ifrån och konvertera till en användbar variabel är inget problem. Att göra detta med 5 datapunkter och i realtid visa dom i sifferform i konsolen år inget problem. Det jag misstänker händer är att när jag sedan lägger till att flytta en mätare och tex skicka 500 pulser med x tid paus mellan pulserna så blir det ett avbrott på 500x tid från att göra annat.
ds77:s förslag med att köra fler picos kan vara intressant. På hundpromenaden funderade jag på om jag skulle ha CANPico för att ta emot och behandla CAN-data. Sedan skulle jag kunna skicka detta till ett par andra picos som sköter pulserandet till stepper. Kanske ha kommunikationen mellan dem via SPI? Skulle man få till att använda båda kärnorna i Picon skulle man i så fall i princip kunna styra varje mätare med en egen cpu-kärna.
Jag bygger varken styrkretsar eller programmerar till vardags så allt detta är lite klurigt, speciellt eftersom det inte bara ska fungera utan fungera effektivt.
@cittra49: Det är en 1971 Fiat 124 Coupé som nu har motor och låda från en 2007 mazda MX5. Har bytt elsystem och har även en ECU från Haltech för motorstyrningen.
Att filtrera vilka CAN-ID som ska hämtas data ifrån och konvertera till en användbar variabel är inget problem. Att göra detta med 5 datapunkter och i realtid visa dom i sifferform i konsolen år inget problem. Det jag misstänker händer är att när jag sedan lägger till att flytta en mätare och tex skicka 500 pulser med x tid paus mellan pulserna så blir det ett avbrott på 500x tid från att göra annat.
ds77:s förslag med att köra fler picos kan vara intressant. På hundpromenaden funderade jag på om jag skulle ha CANPico för att ta emot och behandla CAN-data. Sedan skulle jag kunna skicka detta till ett par andra picos som sköter pulserandet till stepper. Kanske ha kommunikationen mellan dem via SPI? Skulle man få till att använda båda kärnorna i Picon skulle man i så fall i princip kunna styra varje mätare med en egen cpu-kärna.
Jag bygger varken styrkretsar eller programmerar till vardags så allt detta är lite klurigt, speciellt eftersom det inte bara ska fungera utan fungera effektivt.
@cittra49: Det är en 1971 Fiat 124 Coupé som nu har motor och låda från en 2007 mazda MX5. Har bytt elsystem och har även en ECU från Haltech för motorstyrningen.
Re: Styrenhet av mätare (CANBUS)
Nu har jag kommit en bit till på vägen.
Jag kör 2 st atmega 328p (arduino) - en för varvtal och bensinmätare, och en för hastighet, oljetryck och temperatur.
Jag kör med mcp2515 CAN-controller, men även där har jag valt att köra 2st. Detta blev framförallt för att chippet endast har stöd för 6 CAN-id filter. Det är inte bara analoga mätare som behöver data utan även ett par lysdioder i mätarna (CEL, helljus, lågt oljetryck m.m) så det behövs lite fler filter än vad en CAN-controller klarar. I praktiken blir det alltså två lika kretsar på samma kretskort med gemensam strömmatning.
Jag har testat med en Arduino Uno + mcp2515 breakout och jag får mjuk förflyttning av mätarnålarna i både snabb och långsam hastighet. Mycket bättre än Python på Pico! Hittade bra bibliotek för både stepper motorerna (som jag optimerade lite) och för CAN-controllern.
Har beställt hem komponenter så jag kan sätta ihop allt på breadboard och testa i bilen innan jag beställer hem färdiga kretskort
Jag kör 2 st atmega 328p (arduino) - en för varvtal och bensinmätare, och en för hastighet, oljetryck och temperatur.
Jag kör med mcp2515 CAN-controller, men även där har jag valt att köra 2st. Detta blev framförallt för att chippet endast har stöd för 6 CAN-id filter. Det är inte bara analoga mätare som behöver data utan även ett par lysdioder i mätarna (CEL, helljus, lågt oljetryck m.m) så det behövs lite fler filter än vad en CAN-controller klarar. I praktiken blir det alltså två lika kretsar på samma kretskort med gemensam strömmatning.
Jag har testat med en Arduino Uno + mcp2515 breakout och jag får mjuk förflyttning av mätarnålarna i både snabb och långsam hastighet. Mycket bättre än Python på Pico! Hittade bra bibliotek för både stepper motorerna (som jag optimerade lite) och för CAN-controllern.
Har beställt hem komponenter så jag kan sätta ihop allt på breadboard och testa i bilen innan jag beställer hem färdiga kretskort

- Klas-Kenny
- Inlägg: 11751
- Blev medlem: 17 maj 2010, 19:06:14
- Ort: Växjö/Alvesta
Re: Styrenhet av mätare (CANBUS)
Måste du ha individuella filter för varje CAN-meddelande?
Brukar gå att hitta något mönster så att du kan maska bort "det mesta", sen finfiltrera i programvara.
Ligger du inte precis på gränsen för vad processorn orkar med, så borde det räcka med en CAN-controller.
Brukar gå att hitta något mönster så att du kan maska bort "det mesta", sen finfiltrera i programvara.
Ligger du inte precis på gränsen för vad processorn orkar med, så borde det räcka med en CAN-controller.
Re: Styrenhet av mätare (CANBUS)
Hur sorterar jag då meddelanden mellan de två 328p? Hur kan 2 MCU läsa data från samma CAN-controller?Klas-Kenny skrev: ↑8 april 2024, 10:06:12 Måste du ha individuella filter för varje CAN-meddelande?
Brukar gå att hitta något mönster så att du kan maska bort "det mesta", sen finfiltrera i programvara.
Ligger du inte precis på gränsen för vad processorn orkar med, så borde det räcka med en CAN-controller.
- Klas-Kenny
- Inlägg: 11751
- Blev medlem: 17 maj 2010, 19:06:14
- Ort: Växjö/Alvesta
Re: Styrenhet av mätare (CANBUS)
Ett sätt vore att koppla ihop de båda processorerna med SPI eller liknande. Och låta den ena skicka över den information som den andra behöver.
Men det är klart, för ett hobbyprojekt där några kronor i komponentkostnad mer eller mindre inte spelar någon roll, kanske det är enklare att kunna köra nästan identisk kod i de två processorerna. Om man inte ser det som en intressant övning att implementera kommunikation emellan processorerna vill säga.
Hade det varit en "riktig" produkt hade man snarare gått på en processor som klarar allt, och även har inbyggd CAN-controller.
Men det är klart, för ett hobbyprojekt där några kronor i komponentkostnad mer eller mindre inte spelar någon roll, kanske det är enklare att kunna köra nästan identisk kod i de två processorerna. Om man inte ser det som en intressant övning att implementera kommunikation emellan processorerna vill säga.
Hade det varit en "riktig" produkt hade man snarare gått på en processor som klarar allt, och även har inbyggd CAN-controller.
Re: Styrenhet av mätare (CANBUS)
Jo, det skulle vara fint med att ha allt i samma paket och minska antal komponenter. Har funderat på MCU med fler pinnar och mer kraft men då måste jag också blanda 3.3v- och 5v-komponenter. Det får bli version 2 i så fall 
Nu vill jag mest få projektet klart för lite bilåkande i sommar!

Nu vill jag mest få projektet klart för lite bilåkande i sommar!
Re: Styrenhet av mätare (CANBUS)
Bumpar en halvgammal tråd:
Bygger du om genom att använda moderna saker avsedda för befintliga moderna bilar, eller är det nån slags universalgrejer?
Om det är avsett för moderna bilar så är väl ett alternativ att använda befintliga instrumentkluster från moderna bilar och låta dess elektronik styra de gamla instrumenten? Eller rent av flytta instrumenten så att du använder bilens originalpanel men själva instrumenten i sig är modernare?
Detta förutsätter förstås att du utgår från nya grejer som ändå är såpass gamla att de hör till bilar som har fysiska visarinstrument snarare än en stor display. Vet inte när det skiftet skedde för olika biltillverkare, och i vilken mån instrumenttavlor för mellangamla / halvnya bilar kan användas med t.ex. motorstyrning till än nyare bilar.
Sen för bensinmotorer finns ju alltid möjligheten att använda en klassisk varvräknare ansluten till styrsignalen på en av tändspolarna. Man får kanske modda varvräknaren så att den fungerar med den klenare styrsignalen, eller använda en varvräknade avsedd för diesel om man vill slippa modda inne i mätaren. Hastighetsmätare går väl på ABS-bromsar och där är det väl antagligen enklast att du använder vad bilen redan har? Eller finns det fördelar att byta ABS-styrenhet osv också? En variant är att sätta buffertkretsar som förstärker signalen från ABS-givarna och mata in detta till bilens original ABS-enhet och låta den i sin tur endast driva hastighetsmätaren men låta den nya ABS-enheten sköta just ABS-bromsar, och kommunikation med motor/växellåda osv. Worst case kan du sätta dubbla ABS-givare, en för gamla och en för nya ABS-boxen. Tror att på t.ex. en 90-tals-Volvo så räcker det med främre ABS-givare för att hastighetsmätaren ska fungera, eller specifikt ena framhjulet i första hand eller nåt sånt.
Vilka fler indikeringar vill du ha? Oljetryck, oljetemp, kylartemp osv går ju att köra separata givare för om man vill.
Bygger du om genom att använda moderna saker avsedda för befintliga moderna bilar, eller är det nån slags universalgrejer?
Om det är avsett för moderna bilar så är väl ett alternativ att använda befintliga instrumentkluster från moderna bilar och låta dess elektronik styra de gamla instrumenten? Eller rent av flytta instrumenten så att du använder bilens originalpanel men själva instrumenten i sig är modernare?
Detta förutsätter förstås att du utgår från nya grejer som ändå är såpass gamla att de hör till bilar som har fysiska visarinstrument snarare än en stor display. Vet inte när det skiftet skedde för olika biltillverkare, och i vilken mån instrumenttavlor för mellangamla / halvnya bilar kan användas med t.ex. motorstyrning till än nyare bilar.
Sen för bensinmotorer finns ju alltid möjligheten att använda en klassisk varvräknare ansluten till styrsignalen på en av tändspolarna. Man får kanske modda varvräknaren så att den fungerar med den klenare styrsignalen, eller använda en varvräknade avsedd för diesel om man vill slippa modda inne i mätaren. Hastighetsmätare går väl på ABS-bromsar och där är det väl antagligen enklast att du använder vad bilen redan har? Eller finns det fördelar att byta ABS-styrenhet osv också? En variant är att sätta buffertkretsar som förstärker signalen från ABS-givarna och mata in detta till bilens original ABS-enhet och låta den i sin tur endast driva hastighetsmätaren men låta den nya ABS-enheten sköta just ABS-bromsar, och kommunikation med motor/växellåda osv. Worst case kan du sätta dubbla ABS-givare, en för gamla och en för nya ABS-boxen. Tror att på t.ex. en 90-tals-Volvo så räcker det med främre ABS-givare för att hastighetsmätaren ska fungera, eller specifikt ena framhjulet i första hand eller nåt sånt.
Vilka fler indikeringar vill du ha? Oljetryck, oljetemp, kylartemp osv går ju att köra separata givare för om man vill.
Re: Styrenhet av mätare (CANBUS)
I första stycket säger du att du inte pausar eller väntar, men i andra stycket säger du att du skickar pulser med paus.rug skrev: ↑21 mars 2024, 19:07:24 Som ni säger så finns det säkert massor att hämta på optimering av programmet. Jag skulle inte säga att jag är proffs på att koda. Jag tycker dock att jag i python har lyckats få fram en hyffsat strömlinjeformat kod som i alla fall inte pausar eller väntar någonstans. När jag har testat har jag endast testat med en fast hastighet på mätarnas rörelse. Om man tittar i moderna bilar där mätarna också styrs via CAN så rör sig mätarna både mjukt och i olika hastighet beroende på rate-of-change. Detta har jag dock inte börjat titta på alls ännu.
Att filtrera vilka CAN-ID som ska hämtas data ifrån och konvertera till en användbar variabel är inget problem. Att göra detta med 5 datapunkter och i realtid visa dom i sifferform i konsolen år inget problem. Det jag misstänker händer är att när jag sedan lägger till att flytta en mätare och tex skicka 500 pulser med x tid paus mellan pulserna så blir det ett avbrott på 500x tid från att göra annat.
Jag gissar att du använder MicroPython och där finns ju möjligheten att programmera med "asyncio" för att pauser i en tråd inte ska hindra andra trådar att exekvera (eller tasks som det heter i Python). Ett bra exempel på pulserande utgångar finns här:
https://docs.micropython.org/en/latest/ ... yncio.html
Det är en ganska stor tröskel att börja med asyncio, men när man väl kommer över den så är det ett hyfsat koncept. Och för enklare fall inte så stor tröskel heller.
Pen