Raspberry PI stuurt ongewenst pulses door naar Arduino

Arduino specifieke Software
Berichten: 2
Geregistreerd: 13 Dec 2019, 13:53

Raspberry PI stuurt ongewenst pulses door naar Arduino

Berichtdoor larsgrootnl » 13 Dec 2019, 14:02

Hallo iedereen!

Ik ben nieuw hier en ben net begonnen met Arduino. Zelf programmeer ik wel al jaren met webtalen als PHP en JavaScript.
Ik stuit alleen wel op een probleempje, namelijk het volgende.

Via mijn Windows laptop heb ik een sketch geupload naar de Arduino Nano. De Arduino ontvangt via de serial interface van de laptop (in dit geval) een bedrag. Vervolgens geeft de Arduino dit bedrag weer op een display en kan de gebruiker geld inwerpen in een muntinworp. Deze muntinworp geeft vervolgens per 0,05 pulses door aan de Arduino, welke vervolgens bijhoudt of het bedrag betaald is. Als dit het geval is koppelt deze dat weer terug aan de serial interface. Tot zover werkt dit allemaal helemaal top.

Echter koppel ik de Arduino aan de Raspberry PI via USB dan geeft deze op een of andere manier pulses door aan de pin van de coin acceptor, waardoor dus het bedrag als betaald wordt gezien door de Arduino. Ik heb al e.e.a. getest, dit gebeurt ook als ik een andere pin gebruik, ook met bijvoorbeeld een button i.p.v. de coin acceptor krijgt de Arduino dan pulses als deze aan de Raspberry PI verbonden is. Is de Arduino met mijn Windows laptop of elke andere power adapter verbonden, dan krijgt deze niet die pulses. Overigens ook als ik nog geen python script naar de Arduino heb gestuurd / de Pyserial heb opgestart op de Raspberry PI gebeurt dit.

Heeft iemand enig idee hoe ik dit kan oplossen?
Voor de zekerheid hieronder mijn Arduino code.

Code: Alles selecteren
// Libraries
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

// Constants
const int coinPin = 2;
const int buttonPin = 9;

// Volatiles
volatile boolean coinInserted = false;
volatile boolean newData = false;

float saldo = 0.00;
float prijs = 0.00;
int counter = 0;

int coinState = 0;

// Variables
String receivedChar;

// Declarations
LiquidCrystal_I2C lcd(0x27, 16, 2);

// Setup interface
void setup(){
  Serial.begin(9600);
  pinMode(buttonPin, INPUT);
  digitalWrite(buttonPin, HIGH);
  digitalWrite(coinPin, HIGH);
  attachInterrupt(digitalPinToInterrupt(coinPin), addAmount, RISING);
  lcd.init();
  lcd.backlight();
  lcd.clear();
  lcd.setCursor(5, 0);
  if(prijs == 0.00){
    lcd.print("Welkom");
    lcd.setCursor(1, 1);
    lcd.print("Maak uw keuze.");
  } else{
    lcd.setCursor(0, 0);
    lcd.print("Prijs:");
    lcd.setCursor(8, 0);
    lcd.print(prijs);
    lcd.setCursor(0, 1);
    lcd.print("Tegoed:");
    lcd.setCursor(8, 1);
    lcd.print(saldo);
  }
}

// Declare loop functions
void loop() {
  if(prijs > 0){
    if(coinInserted == true){
      coinInserted = false;
      saldo = saldo + 0.05;
      lcd.setCursor(8, 1);
      lcd.print(saldo);
    } else if(digitalRead(buttonPin) == LOW && (saldo == 0.00 || saldo == 0)){
      cancelPayment();         
    }
    checkGoal();
  }
  readSer();
  transmitSer();
}

// Declare other functions
// Function to read serial input
void readSer() {
   if(Serial.available() > 0) {
      receivedChar = Serial.readStringUntil('\n');
      newData = true;
   } 
}

// Function to transmit serial input
void transmitSer() {
   if(newData == true){
      if(receivedChar == "reset"){
        lcd.clear();
        lcd.setCursor(5, 0);
        lcd.print("Welkom");
        lcd.setCursor(1, 1);
        lcd.print("Maak uw keuze.");
      } else if(receivedChar.toFloat() > 0){
        prijs = receivedChar.toFloat();
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("Prijs:");
        lcd.setCursor(8, 0);
        lcd.print(prijs);
        lcd.setCursor(0, 1);
        lcd.print("Tegoed:");
        lcd.setCursor(8, 1);
        lcd.print(saldo);
      } else if(receivedChar == "done"){
        lcd.clear();
        lcd.setCursor(3, 0);
        lcd.print("Bedankt en");
        lcd.setCursor(3, 1);
        lcd.print("tot ziens!");
        delay(4000);
        lcd.clear();
        lcd.setCursor(5, 0);
        lcd.print("Welkom");
        lcd.setCursor(1, 1);
        lcd.print("Maak uw keuze.");
      }
      newData = false;
   }
}

// Function to check if goal has been reached
void checkGoal() {
  if(abs(saldo-prijs) > 0.001){
   
  } else if(prijs > 0){
     saldo = 0.00;
     prijs = 0.00;
     Serial.println("paid");
     lcd.clear();
     lcd.setCursor(1, 0);
     lcd.print("Uw drank wordt");
     lcd.setCursor(3, 1);
     lcd.print("bereid....");
   }
}

void cancelPayment() {
    saldo = 0.00;
    prijs = 0.00;
    Serial.println("cancelled");
    lcd.clear();
    lcd.setCursor(3, 0);
    lcd.print("AFGEBROKEN");
    delay(4000);
    lcd.clear();
    lcd.setCursor(5, 0);
    lcd.print("Welkom");
    lcd.setCursor(1, 1);
    lcd.print("Maak uw keuze.");
}

void addAmount() {
  coinInserted = true;
}


Alvast super bedankt!

Groet,

Lars

Advertisement

Berichten: 3066
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: Raspberry PI stuurt ongewenst pulses door naar Arduino

Berichtdoor shooter » 13 Dec 2019, 14:37

heb je de Gnd allemaal goed aan elkaar zitten op een centraal punt?
zet de plus 0.05 in de interupt.
als de usb stil is dan reset de arduino.
paul deelen
shooter@home.nl

Berichten: 2
Geregistreerd: 13 Dec 2019, 13:53

Re: Raspberry PI stuurt ongewenst pulses door naar Arduino

Berichtdoor larsgrootnl » 13 Dec 2019, 18:24

Hallo Shooter,

Super bedankt voor je snelle antwoord!
Alle grounds zijn met elkaar verbonden, zowel die van de 12v power supply, als de arduino als de coin acceptor.



0.05 in de interrupt haalde helaas niets uit...
Ik heb net een geminimaliseerde code geprobeerd:
Code: Alles selecteren
int coin = 0;
void setup(){
  Serial.begin(9600);
  attachInterrupt(digitalPinToInterrupt(2), pulse, RISING);
}

void pulse(){
   coin = coin + 1;
   Serial.println(coin);
}

void loop(){

}


Resultaat: op de Windows laptop alles helemaal top (gooi ik een muntje in dan komt er 1 in de console, gooi ik er nog 1 in 2 etc.). Raspberry PI blijft non stop optellen in de console...

Als ik de button aansluit met deze code is het resultaat dat hij op de Windows PC bij het indrukken van de knop netjes stopt met tellen, bij de Raspberry blijft hij doorgaan met tellen. Ook blijft dan het lichtje RX op de Arduino continu branden, terwijl bij de laptop het RX lichtje op de Arduino uitgaat als ik de knop indruk.

Ook een andere Arduino had helaas niet het gewenste resultaat via de pi...

Hopelijk heeft iemand nog een idee wat het kan zijn.

Groet,

Lars

Gebruikers-avatar
Berichten: 5018
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Raspberry PI stuurt ongewenst pulses door naar Arduino

Berichtdoor nicoverduin » 14 Dec 2019, 12:31

Coin sowieso als volatile definieren
Die serial print ui de ISR halen
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 3066
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: Raspberry PI stuurt ongewenst pulses door naar Arduino

Berichtdoor shooter » 14 Dec 2019, 15:27

ik heb geen Pi dus kan het niet proberen, je kunt kijken met een USB snooper om te kijken of er rara dingen gebeuren op de lijn zoals stuurkarakters of reset van de USB controller op de arduino.
paul deelen
shooter@home.nl

Gebruikers-avatar
Berichten: 2399
Geregistreerd: 06 Aug 2016, 01:03

Re: Raspberry PI stuurt ongewenst pulses door naar Arduino

Berichtdoor Koepel » 14 Dec 2019, 16:06

Wat is het signaal van de coin acceptor ?
Heb je gegevens van dat apparaat.

Een ingang als input zetten met de interne pullup weerstand gaat tegenwoordig met INPUT_PULLUP.
https://www.arduino.cc/reference/en/language/functions/digital-io/pinmode/

De interne pullup weerstand is vanzelfsprekend veel te weinig pullup als de uitgang van het apparaat een soort van open-collector of opto-coupler is.

Een Arduino Nano met een ATmega328P microcontroller is 8-bits. De compiler gebruikt als default 16 bit, maar het blijft 8 bit.
Om het helemaal netjes te doen kun je niet zomaar een volatile variabele van 16-bit in de loop() gebruiken, als die variabele in een interrupt gewijzigd kan worden. Dan zou er een interrupt kunnen komen tussen het lezen van de twee bytes.

Code: Alles selecteren
volatile unsigned int coin;

void loop()
{
  int coinCopy;

  noInterrupts();
  if( coin > 0)
  {
    coinCopy = coin;
    coin--;
  }
  interrupts();

  // gebruik 'coinCopy' in de loop()
  Serial.println( coinCopy);
}

void pulse()
{
  coin++;
}


Als je de teller een 'byte' of 'uint8_t' of 'unsigned char' maakt, dan hoef je natuurlijk de interrupts niet uit te zetten.

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 4 gasten