Arduino schakelt MOSFET of transistor

Lambiek

Special Member

Kijk hier eens tussen.

https://nl.rs-online.com/web/c/power-supplies-transformers/dc-dc-conve…

Je kunt ook bij andere leveranciers kijken, bijv. bij Reichelt, Conrad, enz.

Als je haar maar goed zit, GROETEN LAMBIEK.
four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
Lambiek

Special Member

Hé rew. Als dat zo is heb ik het verkeerd gelezen of begrepen denk. :)

Als je haar maar goed zit, GROETEN LAMBIEK.

Beste leden,

Ik heb sinds vorige keer erg veel vooruitgang gemaakt.
Het vorige ontwerp is een succes geworden, maar na er te veel van te hebben gevraagd is de PCB helaas doorgebrand.
Na het succes heb ik besloten ermee door te gaan en een nieuw ontwerp te maken die kleiner is en meer uitgangen heeft.
Ik heb daarom besloten om alles helemaal opnieuw te ontwerpen zodat ik veel tips van jullie mee zou kunnen nemen in het nieuwe ontwerp.

Veranderingen zijn:
- Ipv een arduino gebruik ik nu een ATMEGA2560 met arduino bootloader.
Deze heeft namelijk meer uitgangen en is sneller.
- Ik heb BLE en een accelerometer toegevoegd. Ik gebruik hiervoor een HM-10 en een ADXL335
- Ipv de TO220 behuizingen voor de P-MOSFETS gebruik ik nu TO262-3 behuizingen ivm hoogte
- Ik ga wel een schakelende spanningsregelaar gebruiken, maar ga deze zelf maken ivm ruimte. Erg bedankt voor de tips, maar ik besluit de TO220 behuizing over te slaan ivm hoogte.

Wat denken jullie er van?

Het schema staat hier:
https://easyeda.com/JelleBezemer/arduino-motorcycle-computer
Een relevante pagina staat hier:
https://www.circuitsonline.net/forum/view/142899

Mvg, Jelle

Na nog veel aanpassingen zijn de nieuwe PCBs besteld.
Het zal nog een prototype worden om te kijken alles werkt zoals ik wil. De uiteindelijke versie zal kleiner worden.

Sinds de eerste versie heb ik bluetooth en een accelerometer toegevoegd.
Zoals eerder gezegd wordt de module op een brommer geplaatst, waardoor er door de bluetooth bijvoorbeeld geen sleutel meer hoeft te worden gebruikt en de accelerometer functies mogelijk maakt, zoals het automatisch uitschakelen van de knipperlichten na een bocht.

Het eerste wat nu moet blijken is of de hardware het goed doet. Daarna zal ik eerst een basisprogramma schrijven met remlicht, knipperlicht etc.

Daarna kunnen andere functies bedacht worden, zoals bijvoorbeeld een alarm dat af gaat als de brommer beweegt, je telefoon die als dashboard display kan dienen en nog veel meer.

Nu eerst maar wachten tot de printplaten binnenkomen.

Mvg, Jelle

Denken jullie dat de stroommeting dmv de INA193 snel genoeg is om bij kortsluiting de mosfet zo snel uit te schakelen dat er geen schade is? Hoe lang kunnen componenten zulke stromen aan? Naar mijn idee zal er bij kortsluiting namelijk toch zeker zo'n 200A doorheen lopen.
De stroommeting zal prioriteit hebben in de code, dus deze zal elke keer zo snel mogelijk af worden gelezen.

Mvg, Jelle

Kruimel

Golden Member

Nee, niet van uit gaan, feedback via een A/D converter is te traag en niet voorspelbaar genoeg om van uit te gaan. Er zit bovendien maar een enkele A/D in zo een ATMega met een multiplexer, dus de coversieperiode moet je nog eens vermenigvuldigen met het aantal kanalen dat je hebt. En dan ga ik er nog van uit dat je A/D continu coverteert, maar ik heb je software niet bekeken.

Dit is de code tot nu toe. Het is alleen nog een basisprogramma om de mosfets aan te sturen en ze uit te schakelen als de stroom te hoog is.
Ik moet nog op de printplaten wachten, dus ik heb de code nog niet uit kunnen proberen.

code:


// inputs
// aux1 light brake turnl turnr horn key
int inputs[] = {44, 43, 39, 38, 37, 36, 35};

// outputs
// aux2 aux1 lbeam hbeam brake turnl turnr horn
int outputs[] = {15, 16, 17, 18, 23, 24, 25, 26};

// signals
// aux2 aux1 lbeam hbeam brake turnl turnr horn
int signals[] = {97, 96, 95, 94, 93, 92, 91, 90};

void setup() {
  Serial.begin(9600);
  //analogReference(external);
  
  // inputs
  for(int i=0; i<7; i++){
    pinMode(inputs[i], INPUT);
  }
  
  // outputs
  for(int i=0; i<8, i++){
    pinMode(outputs[i], OUTPUT);
    digitalWrite(outputs[i], LOW);
  }
  
  // signals
  for(int i=0; i<8, i++){
    pinMode(signals[i], INPUT);
  }
  
  // aux2, aux1, lbeam, hbeam, brake, turnl, turnr, horn
  int outputs_on[8] = {0,0,0,0,0,0,0,0};
  int errors_outputs[] = {0,0,0,0,0,0,0,0};
  
  double batteryvoltage;
  
  unsigned long timer_turnl = 0;
  unsigned long timer_turnr = 0;
  char turnl_type = "default";
  char turnr_type = "fade";
  int brightness_turnl = 0;
  int brigtness_turnr = 0;
  int fadeamount = 5;
  int fadespeed = 100;
}

void loop() {
  if(digitalRead(inputs[6]) == LOW && key_on == false){
    errors_outputs = new int[]{};
    key_on = true;
  }else if(digitalRead(inputs[6] == LOW) && key_on = true){
    // run as normal
  }else if (digitalRead(inputs[6] == HIGH) && key_on == true){
    key_on = false;
  }else{
    // limited features like alarm
  }
  
  // over voltage
  batteryvoltage = analogRead(84);
  if(batteryvoltage > 546){// 16V-5V, (819/16V-3.3V)
    digitalWrite(outputs[7], HIGH);
    outputs_on[7] = 1;
  }else if(batteryvoltage < 546 && outputs_on[7] == 1 && digitalRead(inputs[5]) == HIGH){
    digitalWrite(outputs[7], LOW);
    outputs_on[7] = 0;
  }
  
  // overcurrent
  for(int x=0; x<8; x++){
    if(outputs_on[x] == 1){
	    // check if current is too high
	    if(analogRead(signals[x]) > 307){ // 7.5A-5V
	      // turn off output
	      digitalWrite(outputs[x], LOW);
	      outputs_on[x] = 0;
	      errors_outputs[x] = 1;
	    }
    }
  }
  
  // licht aan
  if(digitalRead(inputs[1]) == LOW && outputs_on[2] == 0 && errors_output[2] == 0 && errors_output[3] == 0){
    digitalWrite(outputs[2]) = HIGH;
    outputs_on[2] = 1;
  }else if(digitalRead(inputs[1]) == HIGH && outputs_on[2] == 1){
    digitalWrite(outputs[2], LOW);
    outputs_on[2] = 0;
  }
  
  // remlicht aan
  if(digitalRead(inputs[2]) == LOW && outputs_on[4] == 0 && errors_outputs[4] == 0){
    digitalWrite(outputs[4]) = HIGH;
  }else if(digitalRead(inputs[2]) == HIGH && outputs_on[4] == 1){
    digitalWrite(outputs[4], LOW);
    outputs_on[4] = 0;
  }
  
  // toeter aan 
  if(digitalRead(inputs[5]) == LOW && outputs_on[7] == 0 && errors_outputs[7] == 0){
    digitalWrite(outputs[7]) = HIGH;
  }else if(digitalRead(inputs[5]) == HIGH && outputs_on[7] == 1){
    digitalWrite(outputs[7], LOW);
    outputs_on[7] = 0;
  }
  
  // rechter knipperlicht aan
  switch(turnr_type){
    case "fade":
      if(digitalRead(inputs[4]) == LOW && errors_outputs[6] == 0){
        timer_turnl = millis();
        brightness = brightness + fadeamount;
        analogWrite(outputs[6], brightness);
        outputs_on[6] = 1;
      }else if(digitalRead(inputs[4]) == HIGH && outputs_on[6] == 1){
        digitalWrite(outputs[6], LOW);
        outputs_on[6] = 0;
        brightness = 0;
      }
    break;
    case "default":
      if(digitalRead(inputs[4]) == LOW && errors_outputs[6] == 0){
        if(outputs_on[6] == 0 || timer_turnr == 0){ // aan als je klikt
          timer_turnr = millis();
          digitalWrite(outputs[6], HIGH);
          outputs_on[6] = 1;
        }else if(outputs_on[6] == 1 || timer_turnr - millis() > 1000){ // uit na een seconde
          timer_turnr = millis();
          digitalWrite(outputs[6], LOW);
          outputs_on[6] = 0;
        }else if(outputs_on[6] == 0 || timer_turnr - millis() > 1000){ // aan na een seconde
          timer_turnr = millis();
          digitalWrite(outputs[6], HIGH);
          outputs_on[6] = 1;
        }
      }else if(digitalRead(inputs[4]) == HIGH && outputs_on[6] == 1){
        digitalWrite(outputs[6], LOW);
        outputs_on[6] = 0;
        timer_turnr = 0;
      }else if(digitalRead(inputs[4]) == HIGH && timer_turnr =!0){
        timer_turnr = 0;
      }
    break;
  }
  
  
// linker knipperlicht aan 
  switch(turnl_type){
    case "fade":
      if(digitalRead(inputs[3]) == LOW && errors_outputs[5] == 0){
        timer_turnl = millis();
        brightness = brightness + fadeamount;
        analogWrite(outputs[5], brightness);
        outputs_on[5] = 1;
      }else if(digitalRead(inputs[3]) == HIGH && outputs_on[5] == 1){
        digitalWrite(outputs[5], LOW);
        outputs_on[5] = 0;
        brightness = 0;
      }
    break;
    case "default":
      if(digitalRead(inputs[3]) == LOW && errors_outputs[5] == 0){
        if(outputs_on[5] == 0 || timer_turnl == 0){ // aan als je klikt
          timer_turnl = millis();
          digitalWrite(outputs[5], HIGH);
          outputs_on[5] = 1;
        }else if(outputs_on[5] == 1 || timer_turnl - millis() > 1000){ // uit na een seconde
          timer_turnl = millis();
          digitalWrite(outputs[5], LOW);
          outputs_on[5] = 0;
        }else if(outputs_on[5] == 0 || timer_turnl - millis() > 1000){ // aan na een seconde
          timer_turnl = millis();
          digitalWrite(outputs[5], HIGH);
          outputs_on[5] = 1;
        }
      }else if(digitalRead(inputs[3]) == HIGH && outputs_on[5] == 1){
        digitalWrite(outputs[5], LOW);
        outputs_on[5] = 0;
        timer_turn1 = 0;
      }else if(digitalRead(inputs[3]) == HIGH && timer_turnl =!0){
        timer_turnl = 0;
      }
    break;
  }

Een tijdje geleden sinds de vorige update.
In deze tijd heb ik grote vooruitgang geboekt.
Het kostte veel moeite om de atmega 2560 werkend te krijgen. Ik had losse chips besteld van AliExpress die compleet leeg waren en dit bleek een grote uitdaging.
Het is nu allemaal gelukt en op het filmpje is een korte demo te zien, slechts om het hardware gedeelte te testen. En het werkt!!!
Te zien is een momentschakelaar die als een permanente schakelaar werkt. Deze laat een led vervagen. Twee functies dus die op een normale brommer onmogelijk zijn.
https://www.youtube.com/watch?v=N5m-gLlfkrU

Mochten nog mensen dit lezen.
Nog meer vooruitgang!
Alles op de PCB werkt nu. Ik heb alles samen proberen te voegen door een kleine app te maken met Blynk. Via Bluetooth kan je iets aansturen tot 7,5A. De stroom die werkelijk wordt gebruikt is ook te zien in de app.
Op een brommer kan je zo makkelijk alles bijhouden zoals bijvoorbeeld of lampen zijn doorgebrand zoals op de derde foto.

Lambiek

Special Member

Leuk dat je nog iets laat horen en zien. :)

Als je haar maar goed zit, GROETEN LAMBIEK.