Autolaturi mökille varavoimaksi Arduinon avulla

No niin, sain tämänkin koodin nyt toimimaan. On vaan aika "ruma" koodi, kun virran ulkopuoliset näytöt tulostetaan virtanäytön päälle ja näyttö värisee. No, kuitenkin nyt toimii.

Sain tuon virran laskennan toimimaan, kun laitoin ko. funktion sellaisenaan loopiin. Lisäksi poistin tilan 3. Moottorin sammuminen on huomioitu (rumasti) niin, että käyttäjä kytkee käyttövirran pois ja vääntää kytkimen uudelleen päälle. :poop:


C++:
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 16, 2);  // Create a new LiquidCrystal_I2C display object with the correct I2C address and display size

// Define the pins
const int currentPin = A0;             //information about current
const int motorPin = 7;                //motor running pin, HIGH = motor running, TEST purpose LOW
const int pwmPin = 9;                  //PWM output pin
const int relayPin = 3;                //Relay control pin
float voltageFactor = 5.0 / 1023.0;    //Factor to convert ADC reading to voltage
float currentFactor = 80 / 4.8351848;  //4.8351848 volts = 80 amps, factor to convert voltage to current
float current;                         //store current value
const int N = 10;                      //number of readings to average
int readings[N];                       //array to store the readings
int motorStatus;                       //0=stopped, 1=starting, 2=running, 3=stopped but did run
unsigned long lastTime = 0;            //timer to measure engine sensor input time for starting


void setup() {

  Serial.begin(9600);  // Start the serial communication

  // Initialize the LCD here
  // Give the screen time to boot
  delay(1500);
  lcd.begin(16, 2);
  lcd.backlight();
  lcd.clear();

  // Change timers on pins to change PWM freq to 122 Hz
  // Pins D9 and D10 - 122 Hz
  TCCR1A = 0b00000001;  // 8bit
  TCCR1B = 0b00000100;  // x256 phase correct

  // Make pins output/input
  pinMode(currentPin, INPUT);       //Information on charging current
  pinMode(motorPin, INPUT_PULLUP);  //For real use, delete _PULLUP (it is for test purpose, pullup resistor)
  pinMode(pwmPin, OUTPUT);          //Charger pwm output
  pinMode(relayPin, OUTPUT);        //Ignition relay pin
}


void motorRunning() {  //engine running function
  if (digitalRead(motorPin) == HIGH && motorStatus == 0) {

    if (millis() - lastTime >= 6000) {  //wait at least 6 seconds before ramping up pwn and so start charging

      motorStatus = 1;
    }

  } else if (motorStatus == 0) {
    lastTime = millis();

    lcd.setCursor(0, 0);  //On lcd print Finnish to start the engine
    lcd.print("K");
    lcd.print((char)0xe1);
    lcd.print("ynnist");
    lcd.print((char)0xe1);
    lcd.print("   ");
    lcd.setCursor(0, 1);
    lcd.print("moottori");
  }
}


void rampUp() {  //rampup pwm

  // Ramp pwm up
  if (motorStatus == 1) {

    analogWrite(pwmPin, 13);
    delay(1000);
    analogWrite(pwmPin, 48);
    delay(1000);
    analogWrite(pwmPin, 83);
    delay(1000);
    analogWrite(pwmPin, 118);
    delay(1000);
    analogWrite(pwmPin, 153);  //Duty Cycle at 60 percent

    motorStatus = 2;
  }
}


void shutDown() {  //engine shutdown, execute relay
  // If the charging current drops below five amperes
  // start the shutdown function and turn off the relay for 15 seconds
  if (current < 5 && motorStatus == 2) {
    digitalWrite(relayPin, LOW);
    lcd.setCursor(0, 0);
    lcd.print("Sammutus... ");
    

    //motorStatus = 3;
  } else {
    digitalWrite(relayPin, HIGH);  //else, keep relay on

  }
}


void motorDidRun() {  //engine has stopped after it was running, this function is not needed at the time

  if (motorStatus == 3) {
    lcd.setCursor(0, 0);
    lcd.print("K");
    lcd.print((char)0xe1);
    lcd.print("ynnist");
    lcd.print((char)0xe1);
    lcd.print("   ");
    lcd.setCursor(0, 1);
    lcd.print("uudelleen");
  }
}


void loop() {


  //calculate current from shunt reading
  // Calculate the charging current from the average and display it on the LCD screen.
  // take N readings and store them in the array


  for (int i = 0; i < N; i++) {
    readings[i] = analogRead(currentPin);
    delay(10);  // wait for 10 milliseconds between readings
  }

  // calculate the average of the N readings
  float sum = 0;
  for (int i = 0; i < N; i++) {
    sum += readings[i];
  }
  float average = sum / N;

  float voltage = average * voltageFactor;  //  Convert ADC reading to voltage

  current = voltage * currentFactor;  // Convert voltage to current
  lcd.setCursor(0, 0);
  lcd.print("Latausvirta:");
  lcd.setCursor(0, 1);
  lcd.print((int)current);
  lcd.print("  ");
  lcd.setCursor(3, 1);
  lcd.print(" A");
  lcd.setCursor(5, 1);
  lcd.print("        ");



  motorRunning();
  rampUp();
  shutDown();
  motorDidRun();
  Serial.println("Motor status: ");
  Serial.println((int)motorStatus);
  Serial.println("Current: ");
  Serial.println((float)current);
}
 
No niin, sain tämänkin koodin nyt toimimaan. On vaan aika "ruma" koodi, kun virran ulkopuoliset näytöt tulostetaan virtanäytön päälle ja näyttö värisee. No, kuitenkin nyt toimii.

Sain tuon virran laskennan toimimaan, kun laitoin ko. funktion sellaisenaan loopiin. Lisäksi poistin tilan 3. Moottorin sammuminen on huomioitu (rumasti) niin, että käyttäjä kytkee käyttövirran pois ja vääntää kytkimen uudelleen päälle. :poop:


C++:
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 16, 2);  // Create a new LiquidCrystal_I2C display object with the correct I2C address and display size

// Define the pins
const int currentPin = A0;             //information about current
const int motorPin = 7;                //motor running pin, HIGH = motor running, TEST purpose LOW
const int pwmPin = 9;                  //PWM output pin
const int relayPin = 3;                //Relay control pin
float voltageFactor = 5.0 / 1023.0;    //Factor to convert ADC reading to voltage
float currentFactor = 80 / 4.8351848;  //4.8351848 volts = 80 amps, factor to convert voltage to current
float current;                         //store current value
const int N = 10;                      //number of readings to average
int readings[N];                       //array to store the readings
int motorStatus;                       //0=stopped, 1=starting, 2=running, 3=stopped but did run
unsigned long lastTime = 0;            //timer to measure engine sensor input time for starting


void setup() {

  Serial.begin(9600);  // Start the serial communication

  // Initialize the LCD here
  // Give the screen time to boot
  delay(1500);
  lcd.begin(16, 2);
  lcd.backlight();
  lcd.clear();

  // Change timers on pins to change PWM freq to 122 Hz
  // Pins D9 and D10 - 122 Hz
  TCCR1A = 0b00000001;  // 8bit
  TCCR1B = 0b00000100;  // x256 phase correct

  // Make pins output/input
  pinMode(currentPin, INPUT);       //Information on charging current
  pinMode(motorPin, INPUT_PULLUP);  //For real use, delete _PULLUP (it is for test purpose, pullup resistor)
  pinMode(pwmPin, OUTPUT);          //Charger pwm output
  pinMode(relayPin, OUTPUT);        //Ignition relay pin
}


void motorRunning() {  //engine running function
  if (digitalRead(motorPin) == HIGH && motorStatus == 0) {

    if (millis() - lastTime >= 6000) {  //wait at least 6 seconds before ramping up pwn and so start charging

      motorStatus = 1;
    }

  } else if (motorStatus == 0) {
    lastTime = millis();

    lcd.setCursor(0, 0);  //On lcd print Finnish to start the engine
    lcd.print("K");
    lcd.print((char)0xe1);
    lcd.print("ynnist");
    lcd.print((char)0xe1);
    lcd.print("   ");
    lcd.setCursor(0, 1);
    lcd.print("moottori");
  }
}


void rampUp() {  //rampup pwm

  // Ramp pwm up
  if (motorStatus == 1) {

    analogWrite(pwmPin, 13);
    delay(1000);
    analogWrite(pwmPin, 48);
    delay(1000);
    analogWrite(pwmPin, 83);
    delay(1000);
    analogWrite(pwmPin, 118);
    delay(1000);
    analogWrite(pwmPin, 153);  //Duty Cycle at 60 percent

    motorStatus = 2;
  }
}


void shutDown() {  //engine shutdown, execute relay
  // If the charging current drops below five amperes
  // start the shutdown function and turn off the relay for 15 seconds
  if (current < 5 && motorStatus == 2) {
    digitalWrite(relayPin, LOW);
    lcd.setCursor(0, 0);
    lcd.print("Sammutus... ");
    

    //motorStatus = 3;
  } else {
    digitalWrite(relayPin, HIGH);  //else, keep relay on

  }
}


void motorDidRun() {  //engine has stopped after it was running, this function is not needed at the time

  if (motorStatus == 3) {
    lcd.setCursor(0, 0);
    lcd.print("K");
    lcd.print((char)0xe1);
    lcd.print("ynnist");
    lcd.print((char)0xe1);
    lcd.print("   ");
    lcd.setCursor(0, 1);
    lcd.print("uudelleen");
  }
}


void loop() {


  //calculate current from shunt reading
  // Calculate the charging current from the average and display it on the LCD screen.
  // take N readings and store them in the array


  for (int i = 0; i < N; i++) {
    readings[i] = analogRead(currentPin);
    delay(10);  // wait for 10 milliseconds between readings
  }

  // calculate the average of the N readings
  float sum = 0;
  for (int i = 0; i < N; i++) {
    sum += readings[i];
  }
  float average = sum / N;

  float voltage = average * voltageFactor;  //  Convert ADC reading to voltage

  current = voltage * currentFactor;  // Convert voltage to current
  lcd.setCursor(0, 0);
  lcd.print("Latausvirta:");
  lcd.setCursor(0, 1);
  lcd.print((int)current);
  lcd.print("  ");
  lcd.setCursor(3, 1);
  lcd.print(" A");
  lcd.setCursor(5, 1);
  lcd.print("        ");



  motorRunning();
  rampUp();
  shutDown();
  motorDidRun();
  Serial.println("Motor status: ");
  Serial.println((int)motorStatus);
  Serial.println("Current: ");
  Serial.println((float)current);
}

Seuraavana harjoituksena pohjakoodin vaihto ja lcd lisäykset siihen niin ei pitäisi väristä :)
Lcd- päivityksessä pitää joka tapauksessa miettiä mitä päivittää ja koska.

Jos näytöllä lukee "virta 20 A" niin luvun päivitykseen riittää setcursor numeron alkuun, uuden arvon print ja sen jälkeen " A" print. Jos max arvo 2 numeroa niin voi valita tulostaako välilyönnin ennen vai jälkeen .
Näin päivittyy vain muutama merkki eikä koko näytyö.
Clear on kaikkein pahin vilkuttaja jos tekee koko ajan.

Tässä sama kuin sarjatulostuksessa, kannattaa tehdä vain silloin kun tarve eli isot muutokset tilan vaihdossa kerran ja jatkuvasti vain arvojen päivitys.
Jos pitää tyhjentää niin setcursor ja muutaman välilyönnin tulostus on "parempi" kuin clear ja kaikki alusta paitsi jos koko näyttö pitää korvata.
 
Imo toi lcd. Clear on vähän samanlainen paha kun delay eli parempi olla käyttämättä ja ottaa virta arvosta ns vanhan ja reaaliaikasen luvun ja vertaa olikohan.
Koodi:
=!
Operaattori ell suoritetaan jos arvot on eri eli esim if(oldcurrent =! Current)
Do domething
Oldcurrent =current
 
Joo ei tuossa ole lcd.clearia() kuin setup funktiossa. Värinä johtuu nyt siitä, kun jatkuvasti tulostettavan virtanäytön päälle tulostetaan nuo kaksi muuta tilanäyttöä .Tuo varmaan voisi olla niin, että virtaa lasketaan kyllä koko ajan. Olisiko siinä mitään järkeä, että ajattelisi tuota näytön päivitystä tilojen kautta eli tuon virran näytän voisi siirtää tuosta loopista sitten johonkin tilaan?
 
Viimeksi muokattu:
Kuten tuossa yllä jo mainitsin...

Lcd päiivitys vain tilojen vaihdossa -> ei vilku.
Poikkeuksena virran näyttö jossa päivitetään vain se virta- arvo eikä koko näyttö. Perustekstit tilanvaidossa juuri ennen mittauksia.
 
No taas on tämä koodi vähän parempi. Nyt siinä ei enää näyttö värise. Laitoin niin, että virtaa lasketaan koko ajan, mutta näytölle on omat tilat. Eli uutena showCurrent(); , jossa on ehtona, että tilan on oltava 2, eli ns. normaali tila.

Joo, kun tuota laturin säätimen infosivua lukee, niin saattaahan se olla, että jonkun dip-säädön tai vastaavan joutuisi vielä tuohon koodiin ähräämään. Jos siis halutaan, että lataus on mahdollisimman tehokasta, mutta ylijännitteenkään vaaraa ei olisi. Eli jos akkupaketti on oikein tyhjä, niin kuin se aina olisi tätä käytettäessä, ei ymmärrykseni mukaan tuo 60 prossan duty cycle välttämättä riitä päälle 14 voltin jännitteen saamiseen. Sitten kaippa jos duty olisi korkeampi, jännite pyrkisi nousemaan latauksen edistyessä. Tätä varten tein varmuuden vuoksi lisäpiirikorttiin (jossa pwm amplitudin nosto, operaatiovahvistin shuntille) jännitteenjakokytkennän jännitteen mittaamista varten, josta saa Arduinolle sopivan 0-5 voltin feedin.

Latauksesta puheenollenhan tässä on tuo pwm-taajuus 122 Hz. Käsitykseni mukaan, säädin voi hyvin toimia myös sillä, joka olisi ihan ok. Tuohan vaikuttanee kuitenkin ainakin jotenkin näihin duty cycle arvoihin, jos taajuus ei ole aivan justiinsa. Mutta tämä selvinnee ekalla testikäytöllä. Joka ei ole tulossa ihan pian, kun tämä koodi alkaa muuten olla kohta ok, niin välissä pitää rakentaa itse konetta. Rälläkkä käteen.

@ississ mainitsikin, että lataus nähtävästi onnistuisi myös ilman jatkuvaa säätöä, mutta jos ymmärsin oikein, silloin olisi tyydyttävä matalampaan lataustehoon.


C++:
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 16, 2);  // Create a new LiquidCrystal_I2C display object with the correct I2C address and display size

// Define the pins
const int currentPin = A0;             //information about current
const int motorPin = 7;                //motor running pin, HIGH = motor running, TEST purpose LOW
const int pwmPin = 9;                  //PWM output pin
const int relayPin = 3;                //Relay control pin
float voltageFactor = 5.0 / 1023.0;    //Factor to convert ADC reading to voltage
float currentFactor = 80 / 4.8351848;  //4.8351848 volts = 80 amps, factor to convert voltage to current
float current;                         //store current value
const int N = 10;                      //number of readings to average
int readings[N];                       //array to store the readings
int motorStatus;                       //0=stopped, 1=starting, 2=running, 3=stopped but did run, on status 3, just switch off and on again to go back 0
unsigned long lastTime = 0;            //timer to measure engine sensor input time for starting


void setup() {

  Serial.begin(9600);  // Start the serial communication

  // Initialize the LCD here
  // Give the screen time to boot
  delay(1500);
  lcd.begin(16, 2);
  lcd.backlight();
  lcd.clear();

  // Change timers on pins to change PWM freq to 122 Hz
  // Pins D9 and D10 - 122 Hz
  TCCR1A = 0b00000001;  // 8bit
  TCCR1B = 0b00000100;  // x256 phase correct

  // Make pins output/input
  pinMode(currentPin, INPUT);       //Information on charging current
  pinMode(motorPin, INPUT_PULLUP);  //For real use, delete _PULLUP (it is for test purpose, pullup resistor)
  pinMode(pwmPin, OUTPUT);          //Charger pwm output
  pinMode(relayPin, OUTPUT);        //Ignition relay pin
}


void motorRunning() {  //engine running function
  if (digitalRead(motorPin) == HIGH && motorStatus == 0) {

    if (millis() - lastTime >= 6000) {  //wait at least 6 seconds before ramping up pwn and so start charging

      motorStatus = 1;
    }

  } else if (motorStatus == 0) {
    lastTime = millis();

    lcd.setCursor(0, 0);  //On lcd print Finnish to start the engine
    lcd.print("K");
    lcd.print((char)0xe1);
    lcd.print("ynnist");
    lcd.print((char)0xe1);
    lcd.print("   ");
    lcd.setCursor(0, 1);
    lcd.print("moottori");
  }
}


void rampUp() {  //rampup pwm

  // Ramp pwm up
  if (motorStatus == 1) {

    analogWrite(pwmPin, 13);
    delay(1000);
    analogWrite(pwmPin, 48);
    delay(1000);
    analogWrite(pwmPin, 83);
    delay(1000);
    analogWrite(pwmPin, 118);
    delay(1000);
    analogWrite(pwmPin, 153);  //Duty Cycle at 60 percent

    motorStatus = 2;
  }
}


void shutDown() {  //engine shutdown, execute relay
  // If the charging current drops below five amperes
  // start the shutdown function and turn off the relay for 15 seconds
  if (current < 5 && motorStatus == 2) {
    digitalWrite(relayPin, LOW);
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Sammutus");


    motorStatus = 3;
   
  } else {
    digitalWrite(relayPin, HIGH);  //else, keep relay on
  }
}


void showCurrent() {  //show current on lcd only when normal running state

  if (motorStatus == 2) {
    lcd.setCursor(0, 0);
    lcd.print("Latausvirta:");
    lcd.setCursor(0, 1);
    lcd.print((int)current);
    lcd.print("  ");
    lcd.setCursor(3, 1);
    lcd.print(" A");
    lcd.setCursor(5, 1);
    lcd.print("        ");
  }
}


void loop() {


  //calculate current from shunt reading
  // Calculate the charging current from the average and display it on the LCD screen.
  // take N readings and store them in the array
  for (int i = 0; i < N; i++) {
    readings[i] = analogRead(currentPin);
    delay(10);  // wait for 10 milliseconds between readings
  }

  // calculate the average of the N readings
  float sum = 0;
  for (int i = 0; i < N; i++) {
    sum += readings[i];
  }
  float average = sum / N;

  float voltage = average * voltageFactor;  //  Convert ADC reading to voltage

  current = voltage * currentFactor;  // Convert voltage to current



  motorRunning();
  rampUp();
  shutDown();
  showCurrent();
  Serial.println("Motor status: ");
  Serial.println((int)motorStatus);
  Serial.println("Current: ");
  Serial.println((float)current);
}
 
Viimeksi muokattu:
Tässäpä muutamia kuvia protomeiningistä. Tuo säänkestävä boksi on jo lopullinen, joten se kiinnitetään aikanaan sitten valmiiseen kokoonpanoon. Nyt sisällä on toki johtosekamelska, kun on testailtu. Kotelosta puuttuu vielä

  1. 5 V virtalähde
  2. Lisäkortti, jossa
    • 150 A / 60 mV shunttivastusta varten operaatiovahvistinpiiri 150 kertoimella (32 mV --> ~5 V)
    • PWM tasonnostopiiri (5 V PWM --> 14 V PWM)
    • jännitteenjakokytkentä 0-20 V --> 0-5 V jännitteenmittaamiseen
  3. Paljon johdotusta...

DSC_1292.JPG
DSC_1293.JPG
DSC_1294.JPG
 
Tuossa isossa levyssä ei näytä olevan kiinnitysreikiä ?
Sellaiset on aina vähän haastavia. Eikä kannata luottaa kuumaliimaan jos härveli päätyy ulos... jos ei muuten niin varmuuden vuoksi ettei tuli oikosia
 
@ississ , joo, iso alumiinipohjalevy on ruuveilla kiinni kotelossa. Kaikki kortit on myös ruuveilla kiinni tuossa pellissä. Ei ehkä erotu kuvasta! Tärinäanturi on myös ruuvilla kiinni + kuumaliima, jotta ei pyöri miten sattuu. Lisäksi ajattelen, että ehkä lopulliseen hässäkkään varmuuden vuoksi pitää vielä laittaa pellin taustapuolelle mutterit, vaikka pellissä kierre onkin. Toinen vaihtoehto on laittaa kierrelukitetta. :)
 
@ississ , joo, iso alumiinipohjalevy on ruuveilla kiinni kotelossa. Kaikki kortit on myös ruuveilla kiinni tuossa pellissä. Ei ehkä erotu kuvasta! Tärinäanturi on myös ruuvilla kiinni + kuumaliima, jotta ei pyöri miten sattuu. Lisäksi ajattelen, että ehkä lopulliseen hässäkkään varmuuden vuoksi pitää vielä laittaa pellin taustapuolelle mutterit, vaikka pellissä kierre onkin. Toinen vaihtoehto on laittaa kierrelukitetta. :)

Jos tärisee niin kannattaa varmistaa mieluummin muttereilla. Nylock hyvä niin ei tarvitse kiristää hampaat irvessä.
Kuvassa ei tosiaan näy ruuveja, on varmaan liitinrimojen vieressä piilossa.

Itse ehkä laittaisin tärinäanturin erilliseen purkkiin sopivasti tärisevään paikkaan ja loput johonkin joka ei tärise.
Tärinässä kun pitää johdotkin niputtaa tarpeeksi kiinni toisiinsa ja runkoon ettei mene rikki, varsinkin jos eriste on kovahkoa.
Välille sitten hyvä joustava johto joka kestää tärinän. Sittenhän sen tietysti näkee kun systeemi on siellä tärinässä kuinka paljon johdot vipattaa.
 
@ississ Joo tietysti moottori ja laturi tulee kumieristetyksi itse rungosta ja myös tälle kotelolle todennäköisesti laitetaan myös tärinän vaimennuskumit. Anturi on aika laajasti säädettävissä, kun testasin sitä että siinä riittää kyllä säätövaraa ihan mukavasti. Tietysti tässä voi käydä miten vaan, mutta jännä nähdä mitä tuleman pitää.
 
No niin, tässä taas koodinpätkää. Ajattelin jo laittaa siihen valmiiksi tuon jännitteenmittauksen, jos ja kun se DIP-säätö latausjännitteelle tarvitaan.

Laitoin volttien laskennan tuohon virranmittauksen jatkoksi samalla tavalla. Se todennäköisesti kyllä toimii, mutta jotenkin se nappaa nyt jotain tuosta virranlaskennasta, koska se reagoi tuohon virtatulon pinniin liitettyyn potikkaan. Kun volttituloon tarkoitettuun pinniin ei ole kytketty mitään, tuloksena on noin 19 V, kun virtaa simuloiva potikka on täysillä (noin 82 ampeeria). Potikkaa pyöritellessä myös voltit laskee.

Tässä on varmaan joku yksinkertainen kämmi, jota en nyt huomaa. Tai sitten noita funktioita (jännite ja virta) ei voi laittaa noin peräkkäin, vaan ne pitäisi jotenkin erottaa. Loopiin ne mielestäni kuitenkin tulisi laittaa, jotta niitä lasketaan aina ja koko ajan, mutta jotain erottavaa noista voi välistä puuttua.

Lisäksi kokeilin laittaa lcd:n päivitystä niin, että virta- ja jännite vuorottelisivat näytöllä 2000 millisekunnin välein. Ei onnistunut. :hmm:

C++:
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 16, 2);  // Create a new LiquidCrystal_I2C display object with the correct I2C address and display size

// Define the pins
const int currentPin = A0;             //information about current
const int voltagePin = A2;             //information about voltage
const int motorPin = 7;                //motor running pin, HIGH = motor running, TEST purpose LOW
const int pwmPin = 9;                  //PWM output pin
const int relayPin = 3;                //Relay control pin
float voltageFactor = 5.0 / 1023.0;    //Factor to convert ADC reading to voltage
float currentFactor = 80 / 4.8351848;  //4.8351848 volts = 80 amps, factor to convert voltage to current
float sensVfactor = 20 / 4.8351848;    //4.8351848 volts = 20 volts, factor to convert high voltage to 0-5 V
float current;                         //store current value
float sensVoltage;                     //store sensed voltage
const int N = 10;                      //number of current readings to average
const int Y = 10;                      //number of sensed voltage readings to average
int readings[N];                       //array to store the current readings
int readingsV[Y];                      //array to store the sensed voltage readings
int motorStatus;                       //0=stopped, 1=starting, 2=running, 3=stopped but did run, on status 3, just switch off and on again to go back 0
int lcdStep;                           //0=current display, 1=voltage display
unsigned long lastTime = 0;            //timer to measure engine sensor input time for starting
unsigned long lastDisp = 0;            //timer to measure display step time for changing lcd values
unsigned long interval = 2000;         //how often to swap lcd between volts and amps



void setup() {

  Serial.begin(9600);  // Start the serial communication

  // Initialize the LCD here
  // Give the screen time to boot
  delay(1500);
  lcd.begin(16, 2);
  lcd.backlight();
  lcd.clear();

  // Change timers on pins to change PWM freq to 122 Hz
  // Pins D9 and D10 - 122 Hz
  TCCR1A = 0b00000001;  // 8bit
  TCCR1B = 0b00000100;  // x256 phase correct

  // Make pins output/input
  pinMode(currentPin, INPUT);       //Information on charging current
  pinMode(voltagePin, INPUT);       //information on voltage
  pinMode(motorPin, INPUT_PULLUP);  //For real use, delete _PULLUP (it is for test purpose, pullup resistor)
  pinMode(pwmPin, OUTPUT);          //Charger pwm output
  pinMode(relayPin, OUTPUT);        //Ignition relay pin
}


void motorRunning() {  //engine running function
  if (digitalRead(motorPin) == HIGH && motorStatus == 0) {

    if (millis() - lastTime >= 6000) {  //wait at least 6 seconds before ramping up pwn and so start charging

      motorStatus = 1;
    }

  } else if (motorStatus == 0) {
    lastTime = millis();

    lcd.setCursor(0, 0);  //On lcd print Finnish to start the engine
    lcd.print("K");
    lcd.print((char)0xe1);
    lcd.print("ynnist");
    lcd.print((char)0xe1);
    lcd.print("   ");
    lcd.setCursor(0, 1);
    lcd.print("moottori");
  }
}


void rampUp() {  //rampup pwm

  // Ramp pwm up
  if (motorStatus == 1) {

    analogWrite(pwmPin, 13);
    delay(1000);
    analogWrite(pwmPin, 48);
    delay(1000);
    analogWrite(pwmPin, 83);
    delay(1000);
    analogWrite(pwmPin, 118);
    delay(1000);
    analogWrite(pwmPin, 153);  //Duty Cycle at 60 percent

    motorStatus = 2;
  }
}


void shutDown() {  //engine shutdown, execute relay
  // If the charging current drops below five amperes
  // start the shutdown function and turn off the relay for 15 seconds
  if (current < 5 && motorStatus == 2) {
    digitalWrite(relayPin, LOW);
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Sammutus");


    motorStatus = 3;

  } else {
    digitalWrite(relayPin, HIGH);  //else, keep relay on
  }
}


void showCurrent() {  //show current on lcd only when normal running state


  if (motorStatus == 2) {

    unsigned long currentMillis = millis();

    if (currentMillis - lastDisp >= interval) {

      lcd.setCursor(0, 0);
      lcd.print("Latausvirta:");
      lcd.setCursor(0, 1);
      lcd.print((int)current);
      lcd.print("  ");
      lcd.setCursor(3, 1);
      lcd.print(" A");
      lcd.setCursor(5, 1);
      lcd.print("        ");

      lcdStep = 0;

    } else {

      currentMillis = millis();

      lcd.setCursor(0, 0);
      lcd.print("Latausj");
      lcd.print((char)0xe1);
      lcd.print("nnite:");
      lcd.setCursor(0, 1);
      lcd.print((int)sensVoltage);
      lcd.print("  ");
      lcd.setCursor(3, 1);
      lcd.print(" V");
      lcd.setCursor(5, 1);
      lcd.print("        ");

      lcdStep = 1;
    }
  }
}



void loop() {


  //calculate current from shunt reading
  // Calculate the charging current from the average and display it on the LCD screen.
  // take N readings and store them in the array
  for (int i = 0; i < N; i++) {
    readings[i] = analogRead(currentPin);
    delay(10);  // wait for 10 milliseconds between readings
  }

  // calculate the average of the N readings
  float sum = 0;
  for (int i = 0; i < N; i++) {
    sum += readings[i];
  }
  float average = sum / N;

  float voltage = average * voltageFactor;  //  Convert ADC reading to voltage

  current = voltage * currentFactor;  // Convert voltage to current



  //calculate high voltage from voltage divider input
  // Calculate the charging voltage from the average and display it on the LCD screen.
  // take Y readings and store them in the array
  for (int j = 0; j < Y; j++) {
    readingsV[j] = analogRead(voltagePin);
    delay(10);  // wait for 10 milliseconds between readings
  }

  // calculate the average of the N readings
  float sumV = 0;
  for (int j = 0; j < Y; j++) {
    sumV += readingsV[j];
  }
  float averageV = sumV / Y;

  float voltageV = averageV * voltageFactor;  //  Convert ADC reading to voltage

  sensVoltage = voltageV * sensVfactor;  // Convert voltage to real voltage


  motorRunning();
  rampUp();
  shutDown();
  showCurrent();
  Serial.println("Motor status: ");
  Serial.println((int)motorStatus);
  Serial.println("Jannite: ");
  Serial.println((float)sensVoltage);
  Serial.println("Virta: ");
  Serial.println((float)current);
}
 
Laitoin volttien laskennan tuohon virranmittauksen jatkoksi samalla tavalla. Se todennäköisesti kyllä toimii, mutta jotenkin se nappaa nyt jotain tuosta virranlaskennasta, koska se reagoi tuohon virtatulon pinniin liitettyyn potikkaan. Kun volttituloon tarkoitettuun pinniin ei ole kytketty mitään, tuloksena on noin 19 V, kun virtaa simuloiva potikka on täysillä (noin 82 ampeeria). Potikkaa pyöritellessä myös voltit laskee.

Tässä on varmaan joku yksinkertainen kämmi, jota en nyt huomaa. Tai sitten noita funktioita (jännite ja virta) ei voi laittaa noin peräkkäin, vaan ne pitäisi jotenkin erottaa. Loopiin ne mielestäni kuitenkin tulisi laittaa, jotta niitä lasketaan aina ja koko ajan, mutta jotain erottavaa noista voi välistä puuttua.

Analog- tilassa portin digitaaliosuus pitäisi olla pois käytöstä -> käytännössä jos jättää kytkemättä niin arvo voi olla vähän mitä vaan. Eli laita siihen toinen potikka tai edes alasvetovastus niin pitäisi toimia oikein.

Suosittelen myös yhdistämään nuo 2 peräkkäistä mittauslooppia yhdeksi, ei niitä arvoja tarvitse tallentaa taulukkoon vaan summaa suoraan muuttujaan ja jakaa lukumäärällä. Nopeampi ja vie vähemmän resursseja. Ja koska lopputulos menee muualle kertoimien avulla laskettuna niin saman summan voi uusiokäyttää toisellekin mittaukselle.
 
Tässäpä taas vähän parempaa koodia, siis vähän. Nyt tuo näytön vaihtelu halutulla intervallilla voltti- ja ampeerinäytön välillä toimii oikein hyvin. Ainoa pikkuisen harmi on, kun nyt nuo näytön arvot ei päivity intervallin aikana, eli uusi arvo tulostuu näytölle vasta seuraavalla kerralla. En nyt hoksaa, mistä se johtuu. Toisaalta, eipä niitä tarvitsikaan sekuntien tarkkuudella lopullisessa hässäkässä ehkä nähdä, niin voihan se toimia noinkin.

Läppäsin itseäni otsalle, kun kyllähän tuo on varmaan legendaarisimpia "ongelmia" jos määritelty portti jätetään avoimeksi. :)
Kokeeksi otin potikan pois myös virtapinnistä ja myös tuo virta-arvo jäi samalla tavalla kellumaan. Eiköhän tuokin volttimittaus toimi, kunhan siihen on oikea syöte. Voiko tätä muuten turvallisesti testata ulkoisella virtalähteellä, eli syöttää vaikkapa 3 volttia tuohon pinniin maata vasten? Kaiken järjen mukaan voi.

@ississ kertoi mittausloopien yhdistämisestä. Varmasti näin olisi viisainta tehdä. Tästä en vielä oikein ymmärrä mitään. Kuvittelen, että tuossa jotain lisätään jonnekin kuvitteelliseen (?) taulukkoon, ja sieltä lasketaan aina se keskiarvo, jota vasta käytetään lopullisen arvon laskennassa. Tuo koodi on tekoälyn tekemä, ja apinoin tuon virtamittauksen kaveriksi samalla kaavalla volttien mittaamiseen vastaavan pätkän.

Ehkä eniten jumppaa tarvii ajatus, että käytettäisiin samaa summaa uudelleen. Ymmärrän niin, että laskettaisiin keskiarvot ennen kuin yksittäisiä mittauksia (10 x 2 kpl) tallennetaan sinne taulukkoon?

C++:
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 16, 2);  // Create a new LiquidCrystal_I2C display object with the correct I2C address and display size

// Define the pins
const int currentPin = A0;             //information about current
const int voltagePin = A2;             //information about voltage
const int motorPin = 7;                //motor running pin, HIGH = motor running, TEST purpose LOW
const int pwmPin = 9;                  //PWM output pin
const int relayPin = 3;                //Relay control pin
float voltageFactor = 5.0 / 1023.0;    //Factor to convert ADC reading to voltage
float currentFactor = 80 / 4.8351848;  //4.8351848 volts = 80 amps, factor to convert voltage to current
float sensVfactor = 20 / 4.8351848;    //4.8351848 volts = 20 volts, factor to convert high voltage to 0-5 V
float current;                         //store current value
float sensVoltage;                     //store sensed voltage
const int N = 10;                      //number of current readings to average
const int Y = 10;                      //number of sensed voltage readings to average
int readings[N];                       //array to store the current readings
int readingsV[Y];                      //array to store the sensed voltage readings
int motorStatus;                       //0=stopped, 1=starting, 2=running, 3=stopped but did run, on status 3, just switch off and on again to go back 0
int lcdStep;                           //0=current display, 1=voltage display
unsigned long lastTime = 0;            //timer to measure engine sensor input time for starting
unsigned long lastDisp = 0;            //timer to measure display step time for changing lcd values
int interval = 3000;                   //how often to swap lcd between volts and amps



void setup() {

  Serial.begin(9600);  // Start the serial communication

  // Initialize the LCD here
  // Give the screen time to boot
  delay(1500);
  lcd.begin(16, 2);
  lcd.backlight();
  lcd.clear();

  // Change timers on pins to change PWM freq to 122 Hz
  // Pins D9 and D10 - 122 Hz
  TCCR1A = 0b00000001;  // 8bit
  TCCR1B = 0b00000100;  // x256 phase correct

  // Make pins output/input
  pinMode(currentPin, INPUT);         //Information on charging current
  pinMode(voltagePin, INPUT_PULLUP);  //information on voltage, for real use, delete _PULLUP
  pinMode(motorPin, INPUT_PULLUP);    //Vibration sensor in, for motor running detect,  for real use, delete _PULLUP (it is for test purpose, pullup resistor)
  pinMode(pwmPin, OUTPUT);            //Charger pwm output
  pinMode(relayPin, OUTPUT);          //Ignition relay pin
}


void motorRunning() {  //engine running function
  if (digitalRead(motorPin) == HIGH && motorStatus == 0) {

    if (millis() - lastTime >= 6000) {  //wait at least 6 seconds before ramping up pwn and so start charging

      motorStatus = 1;
    }

  } else if (motorStatus == 0) {
    lastTime = millis();

    lcd.setCursor(0, 0);  //On lcd print Finnish to start the engine
    lcd.print("K");
    lcd.print((char)0xe1);
    lcd.print("ynnist");
    lcd.print((char)0xe1);
    lcd.print("   ");
    lcd.setCursor(0, 1);
    lcd.print("moottori");
  }
}


void rampUp() {  //rampup pwm

  // Ramp pwm up
  if (motorStatus == 1) {

    analogWrite(pwmPin, 13);
    delay(1000);
    analogWrite(pwmPin, 48);
    delay(1000);
    analogWrite(pwmPin, 83);
    delay(1000);
    analogWrite(pwmPin, 118);
    delay(1000);
    analogWrite(pwmPin, 153);  //Duty Cycle at 60 percent

    motorStatus = 2;
  }
}


void shutDown() {  //engine shutdown, execute relay
  // If the charging current drops below five amperes
  // start the shutdown function and turn off the relay for 15 seconds
  if (current < 5 && motorStatus == 2) {
    digitalWrite(relayPin, LOW);
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Sammutus");


    motorStatus = 3;

  } else {
    digitalWrite(relayPin, HIGH);  //else, keep relay on
  }
}


void showCurrent() {  //show current and voltage on lcd only when normal running state


  if (motorStatus == 2) {


    if (millis() >= lastDisp + interval && lcdStep == 0) {
      lastDisp += interval;

      lcd.setCursor(0, 0);
      lcd.print("Latausvirta:  ");
      lcd.setCursor(0, 1);
      lcd.print((int)current);
      lcd.print("  ");
      lcd.setCursor(3, 1);
      lcd.print(" A");
    

      lcdStep = 1;

    } else if (millis() >= lastDisp + interval && lcdStep == 1) {
      lastDisp += interval;

      lcd.setCursor(0, 0);
      lcd.print("Latausj");
      lcd.print((char)0xe1);
      lcd.print("nnite:");
      lcd.setCursor(0, 1);
      lcd.print((int)sensVoltage);
      lcd.print("  ");
      lcd.setCursor(3, 1);
      lcd.print(" V");
      lcd.setCursor(5, 1);
      lcd.print("        ");

      lcdStep = 0;
    }
  }
}



void loop() {


  //calculate current from shunt reading
  // Calculate the charging current from the average and display it on the LCD screen.
  // take N readings and store them in the array
  for (int i = 0; i < N; i++) {
    readings[i] = analogRead(currentPin);
    delay(10);  // wait for 10 milliseconds between readings
  }

  // calculate the average of the N readings
  float sum = 0;
  for (int i = 0; i < N; i++) {
    sum += readings[i];
  }
  float average = sum / N;

  float voltage = average * voltageFactor;  //  Convert ADC reading to voltage

  current = voltage * currentFactor;  // Convert voltage to current



  //calculate high voltage from voltage divider input
  // Calculate the charging voltage from the average and display it on the LCD screen.
  // take Y readings and store them in the array
  for (int j = 0; j < Y; j++) {
    readingsV[j] = analogRead(voltagePin);
    delay(10);  // wait for 10 milliseconds between readings
  }

  // calculate the average of the N readings
  float sumV = 0;
  for (int j = 0; j < Y; j++) {
    sumV += readingsV[j];
  }
  float averageV = sumV / Y;

  float voltageV = averageV * voltageFactor;  //  Convert ADC reading to voltage

  sensVoltage = voltageV * sensVfactor;  // Convert voltage to real voltage







  motorRunning();
  rampUp();
  shutDown();
  showCurrent();
  Serial.print("Lcdstep: ");
  Serial.print((int)lcdStep);
  Serial.println();
  Serial.print("Jannite: ");
  Serial.print((float)sensVoltage);
  Serial.println();
  Serial.print("Virta: ");
  Serial.print((float)current);
  Serial.println();
}
 
Läppäsin itseäni otsalle, kun kyllähän tuo on varmaan legendaarisimpia "ongelmia" jos määritelty portti jätetään avoimeksi. :)
Kokeeksi otin potikan pois myös virtapinnistä ja myös tuo virta-arvo jäi samalla tavalla kellumaan. Eiköhän tuokin volttimittaus toimi, kunhan siihen on oikea syöte. Voiko tätä muuten turvallisesti testata ulkoisella virtalähteellä, eli syöttää vaikkapa 3 volttia tuohon pinniin maata vasten? Kaiken järjen mukaan voi.

Voi syöttää kunhan varmistaa ettei syötä enempää kuin avr käyttöjännite, tässä taitaa olla 5V.

@ississ kertoi mittausloopien yhdistämisestä. Varmasti näin olisi viisainta tehdä. Tästä en vielä oikein ymmärrä mitään. Kuvittelen, että tuossa jotain lisätään jonnekin kuvitteelliseen (?) taulukkoon, ja sieltä lasketaan aina se keskiarvo, jota vasta käytetään lopullisen arvon laskennassa. Tuo koodi on tekoälyn tekemä, ja apinoin tuon virtamittauksen kaveriksi samalla kaavalla volttien mittaamiseen vastaavan pätkän.

Ehkä eniten jumppaa tarvii ajatus, että käytettäisiin samaa summaa uudelleen. Ymmärrän niin, että laskettaisiin keskiarvot ennen kuin yksittäisiä mittauksia (10 x 2 kpl) tallennetaan sinne taulukkoon?

C++:
  // NYKYISESTÄ KOODISTA:

  // loop 1: mittaa virrat taulukkoon (10 arvoa)
  for (int i = 0; i < N; i++) {
    readings[i] = analogRead(currentPin);
    delay(10);
  }

  // loop 2: taulukon arvojen keskiarvo
  float sum = 0;
  for (int i = 0; i < N; i++) {
    sum += readings[i];
  }
  float average = sum / N;
  float voltage = average * voltageFactor;  //  Convert ADC reading to voltage
  current = voltage * currentFactor;  // Convert voltage to current

  // loop 3: mittaa jännitteet eri taulukkoon (voisi olla samakin)
  for (int j = 0; j < Y; j++) {
    readingsV[j] = analogRead(voltagePin);
    delay(10);  // wait for 10 milliseconds between readings
  }

  // loop 4 : jännitemittausten keskiarvo
  float sumV = 0;
  for (int j = 0; j < Y; j++) {
    sumV += readingsV[j];
  }
  float averageV = sumV / Y;
  float voltageV = averageV * voltageFactor;
  sensVoltage = voltageV * sensVfactor;


  // KUMPIKIN YHDELLÄ LOOPILLA (EN TESTANNUT):

  // Mittausten lukumäärä
  #define NUMBER_OF_MEASURES 10
  // Virta
  float sum = 0.0;
  // Mitataan virta 10 kertaa ja lasketaan suoraan summaan
  for (int i = 0; i < NUMBER_OF_MEASURES ; i++) {
    sum += analogRead(currentPin);
    delay(10);
  }
  // Lopuksi jako määrällä => keskiarvo ja kertoimet -> reaalimaailman arvo
  current = (sum / (float)NUMBER_OF_MEASURES) * voltageFactor * currentFactor;

  // Jännite
  sum = 0.0;   // Uusiokäytetään sum- muuttuja koska laskettu virta tallennettiin eri muuttujaan, sum arvolla ei tehdä enää mitään.
  // HUOM: int i on määritetty vain for() sisällä, voi käyttää samaa eikä sekoita looppeja
  for (int i = 0; i < NUMBER_OF_MEASURES; i++) {
    sum += analogRead(voltagePin);
    delay(10);
  }
  voltage = (sum / (float) NUMBER_OF_MEASURES) * voltageFactor * sensVFactor;
Tuossa siis on mittaukselle 1 looppi. Koska taulukkoon tallennetuilla arvoilla ei tehdä muuta kuin lasketaan keskiarvo niitä on turha edes tallentaa taulukkoon. Ihan yhtä hyvin suoraan summaan joka sitten lopuksi jaetaan mittausten määrällä ja tulos kerrotaan noilla kertoimilla että saadaan reaalimaailman arvo.
Lisäksi voltageFactor * xFactor kannattaa tietysti laskea valmiiksi koska kumpikaan ei muutu missään vaiheessa.

Tämän voisi tehdä myös täysin yhdellä loopilla jolloin tarvitaan 2 summaa.
Ja koska analogread eri pinnien välillä vaihtaa ADC MUX tulos niin yhtä hyvin kannattaa odotella vähän myös mittauksen vaihdon kohdalla.

C++:
  // Mittausten lukumäärä
  #define NUMBER_OF_MEASURES 10

  // Virta
  float sumC = 0.0;
  float sumV = 0.0;
  for (int i = 0; i < NUMBER_OF_MEASURES; i++) {
    sumC += analogRead(currentPin);
    delay(5);
    sumV += analogRead(voltagePin);
    delay(5);
  }
  current = (sumC / (float)NUMBER_OF_MEASURES) * voltageFactor * currentFactor;
  sensVoltage = (sumV / (float) NUMBER_OF_MEASURES) * voltageFactor * sensVFactor;

Edit: typojen korjaus
 
Viimeksi muokattu:
Nonnih,

testasin koko hässäkkää liitettynä laturiin ja seuraavassa tuloksia.

  • Virtalähteeltä 12 V - 5 V tulee yleismittarilla mitattuna USB-liittimestä maata vasten oikea, 5 V, mutta kun se liitetään Arduinoon, laskee jännite 3 volttiin, eikä toimi. Kyseessä oli tämän tyyppinen: https://www.elektroniikkaosat.com/c-95/ ... oja-i.html Nämähän voi olla kiina-laatua, joten vika voi olla tässä virtalähteessä. Irrallisella matkapuhelimen laturilla usb-johdon kautta toimi.
  • Shunttipiiriltä tulee ajoittain, jollakin käynnistyskerralla, Arduinolle kännykän laturin jännite, n. 4,7 volttia joten ampeerit näytöllä on koko ajan noin 76 ampeeria. Tämä johtunee jälleen siitä, kun johdossa ei liiku mitään, niin alkaa "kellumaan". Pitäiskö tässä olla siis _PULLUP aina käytössä? Se toki vaikuttaa sitten kalibrointiarvoon, mutta sehän ei haittaa?
  • Mitattuna laturin päästä, RC-pinniin menee 122 Hz:n ja 60 prosentin, mutta oskilloskoopin mielestä 5 voltin PWM. Epäilen jo oskilloskooppia, vaikka se on toiminut täydellisesti vailla ongelmia. Yleismittarilla mitattuna jännite on noin 10,6 volttia. Hyvin outoa. Laturi ei kuitenkaan lähde lataamaan. Arduinon näytön mukaan jännite on 13,66 volttia, joka on oikein, myös yleismittarilla tulee sama: karkeasti laskettuna (jännitteenjakokytkennästäni) 3,18 V / 4,7 V * 20 V ~ 13,6 V. Myös AS-pinni oli kytkettynä akkujännitteeseen.
Ennen tätä testiä, kannettuani ison akun sisälle, toimi virranmittaus koko ajan oikein, 8,3 ampeeria tuli kahdella H7-lampulla pienen kalibroinnin jälkeen. Mutta kun siis kaikki oli kytkettynä kuin lopullisessa tulee olemaan, homma ei toiminutkaan. Joku tuossa kytkennässä tai piireissä varmasti mättää. Tarkistin johdotuksen vielä useampaan kertaan.

Välttääkseni akun kantelua edes taas sisälle ja talliin, pitää yrittää sisällä testailla 12 V:n virtalähteellä tätä, hankalaa kun on vain 2 ampeerin virtalähde, niin pitää jostain metsästää ehkäpä ampeerin-puolentoista hehku tms. (virtakynnykseksi muutin koodiin nyt todella matalan 0,1 ampeeria, jotta koodi pysyy "päällä"). Tämän testin tein 100 ampeerin vapaa-ajan akulla autotallissa!

Nyt on aivot aika tavalla solmussa!

Mutta, mutta. Sehän toimi taas normaalisti taas lattialla kännykän laturilla ja 12 V:n virtalähteellä (12 voltin piiriin). Tuskin kun oskua kannattaa siis epäillä. Siis laturille meni jostain ihmeen syystä sitten 5 voltin pulssi!
:shock:
Elikkä kun se oli kytkettynä lopullisessa muodossaan, niin silloin ei toiminut. Shuntti on tuossa sisätestissäni vielä testaamatta, mutta tässä kuva.

Miten muuten, pitäisikö tuossa Vmax olla tuo 12 V ja Vmin 0 V?

Laitan myös vielä kytkentäkaaviot, mutta kyllä tuosta kuvastakin nähnee suurentamalla, miten on kytketty.

embed

embed
 
Virtalähteeltä 12 V - 5 V tulee yleismittarilla mitattuna USB-liittimestä maata vasten oikea, 5 V, mutta kun se liitetään Arduinoon, laskee jännite 3 volttiin, eikä toimi. Kyseessä oli tämän tyyppinen: https://www.elektroniikkaosat.com/c-95/ ... oja-i.html Nämähän voi olla kiina-laatua, joten vika voi olla tässä virtalähteessä. Irrallisella matkapuhelimen laturilla usb-johdon kautta toimi.

Kuulostaa rikkinäiseltä. Jos ei toimisi toisellakaan niin sitten voisi epäillä kytkentävirhettä...

Shunttipiiriltä tulee ajoittain, jollakin käynnistyskerralla, Arduinolle kännykän laturin jännite, n. 4,7 volttia joten ampeerit näytöllä on koko ajan noin 76 ampeeria. Tämä johtunee jälleen siitä, kun johdossa ei liiku mitään, niin alkaa "kellumaan". Pitäiskö tässä olla siis _PULLUP aina käytössä? Se toki vaikuttaa sitten kalibrointiarvoon, mutta sehän ei haittaa?

Analogitulojen kanssa AVR tulon digiosa kuuluu ottaa pois päältä (varmaan analogread sen jo tekeekin) koska se häiritsee mittausta ja silloin pullup ei ole enää vaihtoehto. Eli AVR digitaalituloa ja analogituloa ei saa sotkea keskenään, vain toinen kerrallaan.
Shuntti/mittauskytkentä pitää tehdä niin että se antaa ulos 0V jos virta on 0.

Mitattuna laturin päästä, RC-pinniin menee 122 Hz:n ja 60 prosentin, mutta oskilloskoopin mielestä 5 voltin PWM. Epäilen jo oskilloskooppia, vaikka se on toiminut täydellisesti vailla ongelmia. Yleismittarilla mitattuna jännite on noin 10,6 volttia. Hyvin outoa. Laturi ei kuitenkaan lähde lataamaan. Arduinon näytön mukaan jännite on 13,66 volttia, joka on oikein, myös yleismittarilla tulee sama: karkeasti laskettuna (jännitteenjakokytkennästäni) 3,18 V / 4,7 V * 20 V ~ 13,6 V. Myös AS-pinni oli kytkettynä akkujännitteeseen.
Ennen tätä testiä, kannettuani ison akun sisälle, toimi virranmittaus koko ajan oikein, 8,3 ampeeria tuli kahdella H7-lampulla pienen kalibroinnin jälkeen. Mutta kun siis kaikki oli kytkettynä kuin lopullisessa tulee olemaan, homma ei toiminutkaan. Joku tuossa kytkennässä tai piireissä varmasti mättää. Tarkistin johdotuksen vielä useampaan kertaan.

Välttääkseni akun kantelua edes taas sisälle ja talliin, pitää yrittää sisällä testailla 12 V:n virtalähteellä tätä, hankalaa kun on vain 2 ampeerin virtalähde, niin pitää jostain metsästää ehkäpä ampeerin-puolentoista hehku tms. (virtakynnykseksi muutin koodiin nyt todella matalan 0,1 ampeeria, jotta koodi pysyy "päällä"). Tämän testin tein 100 ampeerin vapaa-ajan akulla autotallissa!

Nyt on aivot aika tavalla solmussa!

Mutta, mutta. Sehän toimi taas normaalisti taas lattialla kännykän laturilla ja 12 V:n virtalähteellä (12 voltin piiriin). Tuskin kun oskua kannattaa siis epäillä. Siis laturille meni jostain ihmeen syystä sitten 5 voltin pulssi!
:shock:
Elikkä kun se oli kytkettynä lopullisessa muodossaan, niin silloin ei toiminut. Shuntti on tuossa sisätestissäni vielä testaamatta, mutta tässä kuva.

Yksi vaihtoehto pwm jännitetasolle on että tason nostopiiri ei jaksa ajaa koska kuorma on sen verran pieni. Kytkentä pitäisi nähdä, muuten voi vain arvata.

Toinen mahdollinen voisi kuitenkin olla kytkentä jos kerran lattialla toimii.

Mittasitko molemmat (5V ja 10.6V) samaan aikaan ?
Yleismittarilla pwm- signaalin mittaus ei kyllä yleensä näytä mitään järkevää.

Miten muuten, pitäisikö tuossa Vmax olla tuo 12 V ja Vmin 0 V?

Laitan myös vielä kytkentäkaaviot, mutta kyllä tuosta kuvastakin nähnee suurentamalla, miten on kytketty.

embed

Arvaan että skoopin 0 ei ole 0v vaan jotain muuta koska Vpp = 12.4 (= |Vmin|+|Vmax| = 4.9 + 7.5)

Tämän enempää ei voi oikein arvailla, koko systeemin kytkentä pitäisi nähdä.

Tekisin varmaan itse niin että syöttäisin arduinokortille vin kautta jännitteen eikä usb- portin kautta. Kortillahan on 5V regulaattori ja jos kortin lisäksi on vain näyttö ja jotain pientä niin se pitäisi riittää kyllä hyvin.
Jos ei koskaan kytke samaan aikaan usb- johtoa niin sitten voi syöttää suoraan 5V- liittimeen myös, arduinokortilla on vain diodit jotka erottaa eri lähteet toisistaan (usb / vin+regu).

Ei ole mitenkään harvinaista että pöydällä käytettynä akusta/hyvästä powerista kaikki toimii ja sitten virallinen asennus ei kun mukana on ehkä eri poweri, vähän pwm- häiriöitä jne.
Osa voi johtua vain johdotuksista ja/tai maadotuksen toteutustavasta.
 
Kuulostaa rikkinäiseltä. Jos ei toimisi toisellakaan niin sitten voisi epäillä kytkentävirhettä...



Analogitulojen kanssa AVR tulon digiosa kuuluu ottaa pois päältä (varmaan analogread sen jo tekeekin) koska se häiritsee mittausta ja silloin pullup ei ole enää vaihtoehto. Eli AVR digitaalituloa ja analogituloa ei saa sotkea keskenään, vain toinen kerrallaan.
Shuntti/mittauskytkentä pitää tehdä niin että se antaa ulos 0V jos virta on 0.



Yksi vaihtoehto pwm jännitetasolle on että tason nostopiiri ei jaksa ajaa koska kuorma on sen verran pieni. Kytkentä pitäisi nähdä, muuten voi vain arvata.

Toinen mahdollinen voisi kuitenkin olla kytkentä jos kerran lattialla toimii.

Mittasitko molemmat (5V ja 10.6V) samaan aikaan ?
Yleismittarilla pwm- signaalin mittaus ei kyllä yleensä näytä mitään järkevää.



Arvaan että skoopin 0 ei ole 0v vaan jotain muuta koska Vpp = 12.4 (= |Vmin|+|Vmax| = 4.9 + 7.5)

Tämän enempää ei voi oikein arvailla, koko systeemin kytkentä pitäisi nähdä.

Tekisin varmaan itse niin että syöttäisin arduinokortille vin kautta jännitteen eikä usb- portin kautta. Kortillahan on 5V regulaattori ja jos kortin lisäksi on vain näyttö ja jotain pientä niin se pitäisi riittää kyllä hyvin.
Jos ei koskaan kytke samaan aikaan usb- johtoa niin sitten voi syöttää suoraan 5V- liittimeen myös, arduinokortilla on vain diodit jotka erottaa eri lähteet toisistaan (usb / vin+regu).

Ei ole mitenkään harvinaista että pöydällä käytettynä akusta/hyvästä powerista kaikki toimii ja sitten virallinen asennus ei kun mukana on ehkä eri poweri, vähän pwm- häiriöitä jne.
Osa voi johtua vain johdotuksista ja/tai maadotuksen toteutustavasta.
Tuo skoopin näyttämä saattaa johtua ihan siitä että skooppi on AC-couplingilla ja ilmeisesti skooppi on FNIRSI tai joku sen kopio joka muutenkin on vähän "epäselkeä" noiden mittausten kanssa. Mutta tosiaan signaali on reilu 12V peak-to-peak. Ja kuten jo mainittiin niin kytkentäkaavio pitäisi nähdä, tosta kuvasta ei niin paljon jaksa katsoa että varmistaisi ettei se itsessään aiheuta jotain jännää.

Yksi vahva veikkaus tuolle sekoilulle on että joku nollapotentiaali ei olekaan oikeasti nollapotentiaali eli jossain on huono liitos tai joku yhteys puuttuu tms.
 
Itellä tulee mieleen jos laturia pyöritetään tarttis varmaan microcontrollerila olla häiriön poisto /konkkia vin pinnissä ja onhan kaikki miinukset yhteydessä toisiinsa, itse ehkä sähköistäisin arduinon siitä auton akusta eikä erillisellä powerilla. Pullup on ylösveto joka siis +5 arduino ssa pulldown taas alasveto joka vetäis linjan 0v kun siellä ei kulje mitään jota tossa siis ehkä tarvis. Toisaalta jos shuntilla ei ole jännitettä niin analogi Pinnin ei pitäs kellua ainoastaan vispaa hulluna jos pinnissä ei mitään kiinni.
 
Viimeksi muokattu:
Kyllä se virtalähde oli rikki. Ei siihen kestänyt kytkeä Arduinoa pelkästäänkään, nyt laski jännite enää 1,8 volttiin!

Itse ajattelin myös noita Arduinon virransyöttömahdollisuuksia ja päädyin asiaan hieman tutustuttuani valitsemaan USB-liitännän. Niitä muita aina varoiteltiin käyttämästä. Nyt olen taas kääntymässä siihen suuntaan, että ehkä sitä uskaltaisi käyttää kuitenkin muuta reittiä syöttää kortille jännite. Viiden voltin jännite se kannattaa olla, koska sitä tarvitsevat myös muut oheiskortit. Miten olisi tämmöinen? Jopa kiinanmittareilla, jos tuossa luvataan 5 A, niin varmasti pitäisi tämmöiset milliampeerin tai muutaman kymmenen kuormat onnistua!


Tässä olisi kaavio tuosta oheiskytkennästä. Ao. terminaaleista menee sitten Arduinoon, shunttiin, jne. johdot. BTW tein kaavion alun perinkin englanniksi. Enpä tiedä miksi. :p

Laturinohjaus, Lisäkortti ruuviterminaalein.jpg
 
Viimeksi muokattu:
Hauska projekti sulla, olen tätä silmäillyt aina välillä.

Itse hommaisin kiinteällä 5V outputilla olevan powerin, outputin säätöpotikka ei tuo sulle lisäarvoa ja huonolla tuurilla se vikaantuu tai sitä vahingossa pyöräyttää ja output muuttuu. Lataatko siis 5V powerilla akkua vai miksi siitä pitää saada amppeerikaupalla virtaa ulos? Jotta saisit edes 500mA virtaa kulumaan, niin tarvit jo jos jonkinlaista hilavitkutinta arduinon lisäksi. Olen käyttänyt näitä/vastaavia hyvällä menestyksellä monessa paikassa: DC DC converter / Aliexpress . Sanomattakin on selvää että tuollaisesta ei voi ottaa ulos lähellekään tuota luvattua 3A.

Oletko mitannut värkin virrankulutusta?
 
@KanOl , ei tarvi varmasti kauheesti virtaa. Ohjaukseen vaan. Tuo virrankesto ei tietenkään tarvisi olla noin korkea. Vanha varmaan oli vaan rikki. 12 voltin piirissä kulutus oli 0,03, joka laskennallisesti olisi 5 voltin puolella noin 0,08 ampeeria. Kiinteä sen lähtöjännitteen tosiaan kannattaisi olla. Jostain Suomesta pliis! :D Mites tämä: Step-down-muunnin 2 A, 2,95 € - AHaa Elektroniikka
 
Viimeksi muokattu:
@KanOl , ei tarvi varmasti kauheesti virtaa. Ohjaukseen vaan. Tuo virrankesto ei tietenkään tarvisi olla noin korkea. Vanha varmaan oli vaan rikki. 12 voltin piirissä kulutus oli 0,03, joka laskennallisesti olisi 5 voltin puolella noin 0,08 ampeeria. Kiinteä sen lähtöjännitteen tosiaan kannattaisi olla. Jostain Suomesta pliis! :D Mites tämä: Step-down-muunnin 2 A, 2,95 € - AHaa Elektroniikka

Kannattaa katsoa mikä regu arduinokortilla on. Todennäköisesti kestää hyvin kun laitat sen 12V suoraan sisään vin. Monessa regu kestää vähintään 20V sisään niin ei tarvii erillistä ollenkaan kunhan kuorma pysyy alle muutama 100mA. Nuo on yleensä 800mA-1A mutta isoilla virroilla lämpenee liikaa ja siksi pitää olla erillinen.
Suotimeksi vähintään diodi syötöstä ja konkka arduinon puolelle.
 
Kyllä se virtalähde oli rikki. Ei siihen kestänyt kytkeä Arduinoa pelkästäänkään, nyt laski jännite enää 1,8 volttiin!

Itse ajattelin myös noita Arduinon virransyöttömahdollisuuksia ja päädyin asiaan hieman tutustuttuani valitsemaan USB-liitännän. Niitä muita aina varoiteltiin käyttämästä. Nyt olen taas kääntymässä siihen suuntaan, että ehkä sitä uskaltaisi käyttää kuitenkin muuta reittiä syöttää kortille jännite. Viiden voltin jännite se kannattaa olla, koska sitä tarvitsevat myös muut oheiskortit.


Tässä olisi kaavio tuosta oheiskytkennästä. Ao. terminaaleista menee sitten Arduinoon, shunttiin, jne. johdot. BTW tein kaavion alun perinkin englanniksi. Enpä tiedä miksi. :p

Laturinohjaus, Lisäkortti ruuviterminaalein.jpg

Mittaa paljonko kulutus on oikeasti 5V syötöstä, tuskin tarvitsee erillistä. Kannattaa myös katsoa arduinokortin kytkentä miten se on toteutettu eikä ehkä uskoa nettijuttuja hyvästä ja huonosta...
Joka tapauksessa saa aikaan vahinkoa jos kytkee väärin, tässä sama homma.

Pwm- kytkennän transistoreilta puuttuu sulkuvastukset, siis B-E väliltä. Ilman sitä ei välttämättä sulkeudu riittävän nopeasti kuormalla. Samoin hfe pnpllä on aika pieni, nopeude vuoksi ohjaisin ehkä enemmän. 10k on ollut sopiva kytkimen ohjaus hfe tyyliin 400.
Npn kannan alasveto pitää lähdön aisoissa niin kauan kun avr käynnistyy ja lähdöt on input- tilassa. Kannattaa aina olla varma ohjauksissa.
 
Esimerkkinä nämä ovat olleet hyviä:
Molemmista 3.3V malli on myös hyvä.
Itse käytän aika vähän noita halpismalleja, osin myös siitä syystä että triopak on lähellä eikä aina tarvitse tilata ja odottaa kuukautta.
Tuo ahaan versio voi myös olla ihan toimiva. Säädettäviä välttäisin vakiojännitteillä koska ne minitrimmerit on yleensä aika huonoja
 
Mittaa paljonko kulutus on oikeasti 5V syötöstä, tuskin tarvitsee erillistä. Kannattaa myös katsoa arduinokortin kytkentä miten se on toteutettu eikä ehkä uskoa nettijuttuja hyvästä ja huonosta...
Joka tapauksessa saa aikaan vahinkoa jos kytkee väärin, tässä sama homma.

Pwm- kytkennän transistoreilta puuttuu sulkuvastukset, siis B-E väliltä. Ilman sitä ei välttämättä sulkeudu riittävän nopeasti kuormalla. Samoin hfe pnpllä on aika pieni, nopeude vuoksi ohjaisin ehkä enemmän. 10k on ollut sopiva kytkimen ohjaus hfe tyyliin 400.
Npn kannan alasveto pitää lähdön aisoissa niin kauan kun avr käynnistyy ja lähdöt on input- tilassa. Kannattaa aina olla varma ohjauksissa.

Rakensin kytkennät uudestaan talliin, jossa iso akku on. 5 voltin johdosta mitattuna kulutus oli 0,08 ampeeria. Kortit saivat virtansa kännykän laturilla Arduinon USB-portista.

Testissä tulee tosiaan 12 voltin piiri kytkettynä Arduinon A0-navalle koko ajan noin 4,7 V, joka kääntyy noin 76 ampeeriksi. Kun 12 V kytketään pois, virta on 0,60 A (?). Kuitenkin, suoraan Vin-navoista mitattuna jännite on nolla. Virtamittaustesti irrallaan akusta on siis vieläkin tekemättä, yritän saada käsiini jostain pienempivirtaisia hehkuja, jotta voisin testata tuolla 2 ampeerin virtalähteelläni.

Muuten testillä aika jänniä tuloksia. RC- ja AS-napa kytkettynä laturi ei lähde lataamaan. Sitten kun, otin AS-navan pois, laturi menee jäykäksi, eli alkaisi lataamaan. Laturin käämi/säädin ottaa noin 4,5 A silloin virtaa akkujohdoista mitattuna. Varmaan ihan normi.

Nyt se jännin osuus. Ei ole väliä, onko Arduino päällä vai ei. Eli kun RC on vain kytketty, laturi jäykistyy. RC-napaan tulee koko ajan 3,9 VDC tällöin. Jos Arduino on päällä lähettäen pulssia, sen pystyy mittaamaan tästä navasta jännitevaihtelun ollessa tuolloin noin 8 V. Kun sekä RC-, että AS-napa ovat kytkettynä (jolloin laturi ei lataa), RC-navasta voi mitata noin 7,5 VDC.

Missään vaiheessa Arduino kortilla ei taikasavut nousseet ja mittailin sieltä kaikenlaisia napoja, niin ei niissä olleet jännitteet normaalista poikkeavia eikä 5 voltin johdossa ollut 0,08 ampeeria enempää virtaa missään vaiheessa. Eli näyttäisikö siltä, että tuonne RC-navalle jostain "vuotaa" nyt sähköä, joka jostain syystä herättää laturin? Luulen, että se jännite tulee laturin säätimeltä, eikä Arduinon päästä. Olen kyllä jo aikanaan kokeillut tätä laturia penkissä, eikä se silloin alkanut lataamaan. Mutta nyt jostain syystä se alkaisi lataamaan...

Toivottavasti näistä sepustuksista saa jotain selvää!
 
Rakensin kytkennät uudestaan talliin, jossa iso akku on. 5 voltin johdosta mitattuna kulutus oli 0,08 ampeeria. Kortit saivat virtansa kännykän laturilla Arduinon USB-portista.

Testissä tulee tosiaan 12 voltin piiri kytkettynä Arduinon A0-navalle koko ajan noin 4,7 V, joka kääntyy noin 76 ampeeriksi. Kun 12 V kytketään pois, virta on 0,60 A (?). Kuitenkin, suoraan Vin-navoista mitattuna jännite on nolla. Virtamittaustesti irrallaan akusta on siis vieläkin tekemättä, yritän saada käsiini jostain pienempivirtaisia hehkuja, jotta voisin testata tuolla 2 ampeerin virtalähteelläni.

Muuten testillä aika jänniä tuloksia. RC- ja AS-napa kytkettynä laturi ei lähde lataamaan. Sitten kun, otin AS-navan pois, laturi menee jäykäksi, eli alkaisi lataamaan. Laturin käämi/säädin ottaa noin 4,5 A silloin virtaa akkujohdoista mitattuna. Varmaan ihan normi.

Nyt se jännin osuus. Ei ole väliä, onko Arduino päällä vai ei. Eli kun RC on vain kytketty, laturi jäykistyy. RC-napaan tulee koko ajan 3,9 VDC tällöin. Jos Arduino on päällä lähettäen pulssia, sen pystyy mittaamaan tästä navasta jännitevaihtelun ollessa tuolloin noin 8 V. Kun sekä RC-, että AS-napa ovat kytkettynä (jolloin laturi ei lataa), RC-navasta voi mitata noin 7,5 VDC.

Missään vaiheessa Arduino kortilla ei taikasavut nousseet ja mittailin sieltä kaikenlaisia napoja, niin ei niissä olleet jännitteet normaalista poikkeavia eikä 5 voltin johdossa ollut 0,08 ampeeria enempää virtaa missään vaiheessa. Eli näyttäisikö siltä, että tuonne RC-navalle jostain "vuotaa" nyt sähköä, joka jostain syystä herättää laturin? Luulen, että se jännite tulee laturin säätimeltä, eikä Arduinon päästä. Olen kyllä jo aikanaan kokeillut tätä laturia penkissä, eikä se silloin alkanut lataamaan. Mutta nyt jostain syystä se alkaisi lataamaan...

Toivottavasti näistä sepustuksista saa jotain selvää!

Tuo 80mA @5V perusteella voit unohtaa sen erillisen 12->5V regun. Laita vaan diodi (tai 2) ja isohko konkka, esim 470u.

Virran mittauskytkennässä täytyy olla virhe jos näyttää jotain kytkettynä jännitteeseen ilman virran kulutusta.
Nyt vain puhelimen varassa vähän hankalaa mutta sanoisin että tuo kytkentä kelpaa vain tilanteeseen jossa oparin käyttöjännite on sama tai suurempi kuin mitattava jännite.
Tai edessä pitää olla sopivat jännitejaot ettei tulot koskaan nouse oparin käyttöjännitteen yli.

Täytyy perehtyä laturin tietoihin kun pääsee taas koneen ääreen alkuviikosta, muuten ei oikein pysty kommentoimaan.
Paitsi että pnp- transistorilta puuttuu katkaisu, käytännössä kanta voi kellua jossain jos npn ei kytke. Sekin voi haitata toimintaa
 
@ississ , joo eikös silloin jännite kuitenkin vaihtele lähdön mukaan? Vai onko vaihtelu n. 11,8-14,5 voltin suhteessa merkityksetöntä?

Käsitykseni mukaan tuolla suntilla ja kytkennällä pitäisi pystyä mittamaan periaatteessa lähes mitä tahansa jännitettä, koska kyseessä on vain jännite-eron mittaaminen. Mittasin myös vin-navoista suoraan, niin ei sen perusteella virran olisi pitänyt olla 76 ampeeria vaan lähellä nollaa. Ehkäpä kytkentä on sitten väärin.

Saattaa olla, että pitää alkaa etsimään ns. tyhmälaturia, kun tämä on näillä rahkeilla sen verran vaikeaa saada toimimaan oikein. Ehkäpä sitä pehmokäynnistystäkään ei sitten tarvitsisi. Releellähän sen käynnistymisen voisi sitten hoitaa, eli heräte kytketään vasta käynnitysviiveen jälkeen.

Mutta ei vielä luovuteta, vaan yritetään miettiä asiaa...
 
@ississ , joo eikös silloin jännite kuitenkin vaihtele lähdön mukaan? Vai onko vaihtelu n. 11,8-14,5 voltin suhteessa merkityksetöntä?

Vin eli arduinon regun tulojännite ei vaikuta 5V lähtöön jos regu on kunnossa.
Jos tarvitset johonkin 12V niin se pitää tehdä hiukan monimutkaisemmalla powerilla joka osaa nostaa tai laskea tarpeen mukaan.
Tätäkö tarkoitit?

Käsitykseni mukaan tuolla suntilla ja kytkennällä pitäisi pystyä mittamaan periaatteessa lähes mitä tahansa jännitettä, koska kyseessä on vain jännite-eron mittaaminen. Mittasin myös vin-navoista suoraan, niin ei sen perusteella virran olisi pitänyt olla 76 ampeeria vaan lähellä nollaa. Ehkäpä kytkentä on sitten väärin.

Kyllä, se mittaa jännite-eroa.
Mutta sen lisäksi oparin tulojen jännitteen pitää pysyä sen käyttöjännitteen rajoissa.
Tulon vastuksista riippuen voi mennä yli jolloin lähtö päätyy toiseen laitaan vaikka tulojen ero onkin 0.
Tämä koskee yleisesti kaikkia piirejä.

Kun kytket tuohon 12V jännitteen niin pinnissä 3 (in +) on 1k/150k jännitejako eli 12V × 149/150 = 11.92V maata vasten.
Mitä siis oparin manuaali sanoo tulojen jännitetasosta käyttöjännitteeseen verrattuna ?
Tulojen pitäisi kyllä pysyä max köyttöjännitteessä ertä opari toimii oikein.
 
Tässä tietysti on se ongelma kun kaikki koitetaan saada samaa aikaa toimimaan. Itse lähtisin ehkä debukkaa tota silleen että ensiksi koittaisin saada pelkästään laturin lataamaan arduinolla ohjaten sitten siitä yksitellen niitä lisä ominaisuuksia lisäten ja aina lisätessä testaa että kaikki aikasemmatkin toimii. Todella vaikeaa lisätä kaikki yhdessä köntässä varsinkin jos hommat ei toimikaan kuten ajateltu.
 
@ississ , tarkoitin siis, että Arduino tarvitsee 5 V toimiakseen. Jos sen toteuttaisi kertomallasi tavalla, onko Arduinolle menevä jännite sopivissa rajoissa, jos tulo ennen noita kertomiasi komponentteja on välillä 11,8-14,5 V (vain esimerkki)? Vai onko niin, että tuohon Arduinon VIN-pinniin pitää vain tulojännite rajata niin, ettei se yli 12 volttia? Jos näin, niin korkeimmillaanhan se nousee vain sinne ehkä 14,5 volttiin. Eli jos tulon saisi rajoitettuna tuolla jännitteellä luokkaan 10 volttia, niin varmaankin toimisi?

MCP601 max käyttöjännite on 6 volttia.
 
Uno ainakin valmistajasta riippuen hyväksyy dc pistokkeesta 6-20v kannataa tarkastaa ekana mitä se arduinon oma regu kestää ja käyttää sitä jos mahdollista tai laittaa vaikka kännyn autolaturin puskemaan akusta 5v arduinolla. Itse olisin laittanut tuon pwm signaalin opton läpi niin saattais saada osan häiriöistä pois
 
Jos tuo virranmittauksen ongelma johtuu tuosta 12 voltista, niin voiko nuo jotenkin helposti erottaa, että niillä on omat maat? Eli tuo 12 voltin piiri pitäisi erottaa tuosta 5 voltin piiristä. Tai helpompaa olisi ehkä vaihtaa opampi, jolla laaja käyttäjännitealue. Kunhan olisi sama kytkentä kuin MCP601:llä!!!
 
@ississ , tarkoitin siis, että Arduino tarvitsee 5 V toimiakseen. Jos sen toteuttaisi kertomallasi tavalla, onko Arduinolle menevä jännite sopivissa rajoissa, jos tulo ennen noita kertomiasi komponentteja on välillä 11,8-14,5 V (vain esimerkki)? Vai onko niin, että tuohon Arduinon VIN-pinniin pitää vain tulojännite rajata niin, ettei se yli 12 volttia? Jos näin, niin korkeimmillaanhan se nousee vain sinne ehkä 14,5 volttiin. Eli jos tulon saisi rajoitettuna tuolla jännitteellä luokkaan 10 volttia, niin varmaankin toimisi?

MCP601 max käyttöjännite on 6 volttia.

Arduinokortilla on jo x->5v regu. Syöttö on mustasta dc- liittimestä tai vin pinnistä, muistaakseni ne on samassa mutta kytkentäkaaviosta sen näkee.
Kuten @Nasty76 jo mainitsi arduino toimii jos syöttö on 6-20V.

Mcp601 on sitten väärä komponentti tuohon tai kytkentä pitää muuttaa.
 
Jos tuo virranmittauksen ongelma johtuu tuosta 12 voltista, niin voiko nuo jotenkin helposti erottaa, että niillä on omat maat? Eli tuo 12 voltin piiri pitäisi erottaa tuosta 5 voltin piiristä. Tai helpompaa olisi ehkä vaihtaa opampi, jolla laaja käyttäjännitealue. Kunhan olisi sama kytkentä kuin MCP601:llä!!!

Maa pitää yleensä olla sama koska arduino mittaa jännitettä.

Oikeasti pitää olla opari jonka voi syöttää mitattavasta jännitteestä tai mittarille pitää tehdä regulointi jännitteen suhteen (eli kelluva maa) mutta siitä seuraa lisää suunniteltavaa kytkentää.

Kaikki operaatiovahvistimet toimivat samalla tavalla, eroja on herkkyydessä, jännitealueissa, nopeudessa jne.
TL081 tai vastaava kelpaisi hyvin.
 
Tässä vielä pari toimivaa virran mittausta.
Max on tarkka siitä että RS+ pitää aina olla ylempänä kuin RS-.
Screenshot_20240329_202228_Chrome.jpg

OC -> virta jännitetietona suoraan arduinolle.
Max 4372 saa eri vahvistuksilla max virran mukaan. Tietysti mittavastus vaikuttaa myös.

Tämän voi säätää pienemmille mittavastuksille, tässä osa muuta kytkentää johon nuo ovat oikea koko.
Screenshot_20240329_202123_Chrome.jpg

R22 ja transistorin välistä voi mitata suoraan 5V arduinolla.
R21 avulla mittavastuksen sovitus ja R22 avulla lähtöjännitealue
 
@ississ , eli eikö toimi niin, että hankkisi opampin, jonka käyttöjännitealue on riittävä (esim. 2-18 volttia) ja kytkentä säilyisi muuten samana? Eli tuokin näyttäisi ampeerit väärin, jos sitä käytetään 5 voltilla? Näyttää siltä, että identtisellä kytkennällä olevia opampeja laajalla käyttöjännitealueella kyllä löytyisi.

Jos asia on näin, niin harmillinen juttu. Olin tällöin ehkä näköjään turhan hätäinen tuon apukortin kanssa, kun tilasin nuo valmiina kiinanmaalta, eikä enää sitä prosessia viitsi pyöräyttää läpi jo pelkästään kustannusten puolesta. Olisi pitänyt varmistaa kytkentä vielä täälläkin! Ei nimittäin pahemmin lähipiirissä ole elektroniikkaihmisiä. Enkä myöskään ala muutamia komponentteja hankkimaan kympin postikuluilla ja läträämään useiden juotosten kanssa reikäkortilla. Lisäksi tätähän yritin jo ja kaksi opampia tuhoutui, kun en tajunnut maadoittaa käpäliä. Siinä sitten ihmeteltiin, miksi antaa koko ajan täysiä ampeereja.

Jos tuo opampin vaihto ei riitä, niin täytyy kai hylätä tämä Fordin laturi ja hankkia perinteinen "tyhmälaturi". Virranmittauksenhan tällöin pitäisi onnistua, koska 12 voltin piiriä ei tällöin lainkaan tuotaisi samaan maapisteeseen muun kytkennän kanssa.

No nyt näkyy kyllä viestissä turhautumisen poikasta, mutta eipä se kaikki aina ole ihanaa ja mahtavaa! Vähän realismia peliin. =D
 
@ississ , eli eikö toimi niin, että hankkisi opampin, jonka käyttöjännitealue on riittävä (esim. 2-18 volttia) ja kytkentä säilyisi muuten samana? Eli tuokin näyttäisi ampeerit väärin, jos sitä käytetään 5 voltilla? Näyttää siltä, että identtisellä kytkennällä olevia opampeja laajalla käyttöjännitealueella kyllä löytyisi.

Jos asia on näin, niin harmillinen juttu. Olin tällöin ehkä näköjään turhan hätäinen tuon apukortin kanssa, kun tilasin nuo valmiina kiinanmaalta, eikä enää sitä prosessia viitsi pyöräyttää läpi jo pelkästään kustannusten puolesta. Olisi pitänyt varmistaa kytkentä vielä täälläkin! Ei nimittäin pahemmin lähipiirissä ole elektroniikkaihmisiä. Enkä myöskään ala muutamia komponentteja hankkimaan kympin postikuluilla ja läträämään useiden juotosten kanssa reikäkortilla. Lisäksi tätähän yritin jo ja kaksi opampia tuhoutui, kun en tajunnut maadoittaa käpäliä. Siinä sitten ihmeteltiin, miksi antaa koko ajan täysiä ampeereja.

Jos tuo opampin vaihto ei riitä, niin täytyy kai hylätä tämä Fordin laturi ja hankkia perinteinen "tyhmälaturi". Virranmittauksenhan tällöin pitäisi onnistua, koska 12 voltin piiriä ei tällöin lainkaan tuotaisi samaan maapisteeseen muun kytkennän kanssa.

No nyt näkyy kyllä viestissä turhautumisen poikasta, mutta eipä se kaikki aina ole ihanaa ja mahtavaa! Vähän realismia peliin. =D

Alkuperäisellä kytkennällä opari on syytä syöttää mitattavasta jännitteestä ja lähtöön sopiva kytkenä että jännite pysyy 0-5V alueella ettei arduino hajoa.
Yleensä syöttö vaikuttaa oparin lähtöön, siksi tuossa mun kytkennässä (huom: ei oma suunnittelu) on transistori -> lähtö on oikeasti virta jolloin mitattava jännite vaikuttaa huomattavasti vähemmän.
Maximin piirissä on varmasti joku vastaava tasonsiirtokytkentä jolla lähtö saadaan logiikan alueelle mitattavasta riippumatta.

Saattaa myös toimia alkuperäisellä jos mitattava ja mittauskytkentä erotetaan toisistaan muuten kuin mittavastuksen osalta. Tämä tarkoittaa kytännössä sitä että sama arduino ei voi enää mitata jännitettä.
Pwm- lähtöön voisi laittaa optoerotuksen mutta jännitteeseen ei saa kätevästi mitään.

Sama tulee vastaan kaikissa virran mittauksissa. Jos arduinon ja akun maat on kytketty jännitettä varten niin alkuperäinen virran mittaus ei sellaisenaa toimi.

Jos mittaa vaon virtaa ja kaikki muu on erotettu niin sitten saattaa toimia.
Myös arduinoa syöttävä poweri pitää olla täysin kelluva.
 
@ississ Jos ymmärrän oikein, niin pelkästään opampin vaihto ja sen käyttöjännite 14 V, tarkoittaisi myös lähtöä 0-14 V, niin silloin pitäisi olla lähdön jälkeen jotain elektroniikkaa, joka jälleen skaalaisi tämän lähdön alueelle 0-5 volttia. Toimisiko tässä yksinkertainen jännitteenjakokytkentä? Käsitykseni mukaan kyllä. Kytkennässähän apukortilla tuota 5 voltin jännitettä käyttää vain tuo opamp, joten käyttöjännite olisi helppo vaihtaa akkupiiriin.
 
Viimeksi muokattu:
@ississ Jos ymmärrän oikein, niin pelkästään opampin vaihto ja sen käyttöjännite 14 V, tarkoittaisi myös lähtöä 0-14 V, niin silloin pitäisi olla lähdön jälkeen jotain elektroniikkaa, joka jälleen skaalaisi tämän lähdön alueelle 0-5 volttia. Toimisiko tässä yksinkertainen jännitteenjakokytkentä? Käsitykseni mukaan kyllä. Kytkennässähän apukortilla tuota 5 voltin jännitettä käyttää vain tuo opamp, joten käyttöjännite olisi helppo vaihtaa akkupiiriin.

Jep. Käyttöjännite mittauksen isommalta puolelta.

Lähtöön tarvittava kytkentä riippuu siitä mikä lähdön jännitealue on kun virralla 0-max. Tuskin koko alue 0-käyttöjännite.
Minimissään jännitejako tai voi olla että perässä pitää olla vahvistin (joko vahvistava tai heikentävä) tason siirron lisäksi.
 
Itse asiassa vaikka Ads1115 piirillä arduino ssa vois käyttää optoja data linjassa joten erotus onnistuu. Tuo 0n 4 vai 5 kanavainen 16bit ad muunnos onnistuisiko tolla lukee shuntista jännite häviön suoran ja siitä sais ampsutkin samalla
 
Viimeksi muokattu:
Itse asiassa vaikka Ads1115 piirillä arduino ssa vois käyttää optoja data linjassa joten erotus onnistuu. Tuo 0n 4 vai 5 kanavainen 16bit ad muunnos onnistuisiko tolla lukee shuntista jännite häviön suoran ja siitä sais ampsutkin samalla
Joka tapauksessa jotain pitää muuttaa, sanoisin että virran mittaus niin ei tarvitse muuttaa ihan kaikkea...

Tietysti yksi vaihtoehto on mitata virta akun - puolelta ja ottaa se sitten huomioon myös jännitteessä. Ei tarvii erotusta eikä pelata isoilla (arduinon kannalta) jännitteillä.
 
@ississ , hmm, niin, sama virtahan se täytyy miinuspuolellakin kulkea. Onko tuossa muuten mitään isompaa muuttamista, jotta voisi mittauksen hoitaa miinupuolella?

Aloin miettiä vielä tuon apukortin kokonaan korvaavia muita vaihtoehtoja, mitenhän tällainen virta-anturi: Virta-anturi -75A ... +75A ACS709 moduuli

Tuossa on lähtöjännite suhteessa virtaan 28 mV/A, eli jos oikein lasken, niin 5000/1023 ~ 4,88... mV/bitti. Ja sitten vastaavasti 4,88...mV/porras / 28 mV/A ~ 0,17 A/porras. Eli mittaus olisi jo tuollaisenaan riittävän tarkka ilman mitään välipiirejä?

Latausvirran voisi rajoittaa vaikkapa 70 ampeeriin, jotta mennä yli anturin alueen.
 
@ississ , hmm, niin, sama virtahan se täytyy miinuspuolella in kulkea. Onko tuossa muuten mitään isompaa muuttamista, jotta voisi mittauksen hoitaa miinupuolella?

Aloin miettiä vielä tuon apukortin kokonaan korvaavia muita vaihtoehtoja, mitenhän tällainen virta-anturi: Virta-anturi -75A ... +75A ACS709 moduuli

Tuossa on lähtöjännite suhteessa virtaan 28 mV/A, eli jos oikein lasken, niin 5000/1023 ~ 4,88... mV/bitti. Ja sitten vastaavasti 4,88...mV/porras / 28 mV/A ~ 0,17 A/porras. Eli mittaus olisi jo tuollaisenaan riittävän tarkka ilman mitään välipiirejä?

Latausvirran voisi rajoittaa vaikkapa 70 ampeeriin, jotta mennä yli anturin alueen.

Miinuspuoli on yleensä helpompi mitata koska on vain jännite maahan verrattuna. Todennäköisesti joutuu tekemään vahvistimen joka nostaa jännitettä ja laajentaa lähdön aluetta, muutenhan mittavastuksen yli voisi mitata suoraan arduinolla. Ilman vahvistinta tarkkuus kärsii koska mittavastus ja siten jännite halutaan pitää minimaalisina.

Tuo acs kävisi kyllä, se on jopa erotettu mitattavasta koska käyttää hall- anturia.
Tuossa pitää huomioida että 0A -> lähtö on Vcc/2 koska sen alle on - ja yli +.
75A jää siis 2.5V alue. Jos 28mV pitää paikkansa niin alueeksi jää 2.1V.
Jos siis avr adc max arvo on 1023 ja siitä käytetään vähän vajaa puolet niin jää ~75A/500 = 0.15A askel. Laskentatarkkuudesta riippuen tuo 0.17A on ihan yhtä lähellä.
Koodissa pitää vaan vähentää mitatusta arvosta ensin 511 (kannattaa testata mitä mittaa nollavirralla) ja sitten vasta laskea kertoimilla.
Tarkemman saisi laittamalla acs ja avr väliin vahvistimen vähän vajaa 2 vahvistuksella ja pienellä tasonsiirrolla mutta ei välttämättä ole tässä tarpeen.
 
@ississ ajattelin, että tuossahan tuo vahvistinpiiri jo on, niin voisiko tuo tuommoisenaan toimia sitten miinupuolella. Toki tulos taitaa olla miinusampeereja (?), mutta senhän voinee koodissa kääntää plussa-ampeereiksi?

@Nasty76, ADS1115 on minullekin tullut vastaan tutkiessa, mutta kun tuo shuntti tuli hankittua ja halvalla sain (7 eur/kpl), niin päädyin siihen. Mutta vielä voi kokoonpano muuttua. Mitä tarkoittaa nuo askeleet 6 voltille? Miksi 6 voltille? Vai mitenhän tuo INA226 sitten?
 

Statistiikka

Viestiketjuista
261 782
Viestejä
4 546 995
Jäsenet
74 849
Uusin jäsen
ookooo

Hinta.fi

Back
Ylös Bottom