vulmachine

algemene C code
Berichten: 4
Geregistreerd: 28 Aug 2016, 21:23

vulmachine

Berichtdoor Balinas » 04 Sep 2016, 10:00

Ik ben nieuw op dit forum, nieuw met arduino en groen als gras wat betreft programmeren en heb een beetje hulp nodig.
De laatste weken ben ik aan het bouwen aan een vulmachine. Ik ben al een heel eind. Ik heb een load cell met een hx711, een lcd scherm waarmee het gewicht uitgelezen wordt en dcmotor die reageert op het aantal gram op de weegschaal. Hij loopt hard bij nul, gaat iets zachter op 40 gram en stop bij 50 gram.
Het hele geheel ga ik, als de code klopt, opschalen en een vulmachine van bouwen met een reservoir en een schudgoot.

Hij doet precies wat het moet doen maar als de motor moet draaien - ik gebruik de PWM op pin 6 om de motor harder of zachter te zetten- dan gaat het lcd scherm helemaal los en laat hij niet meer de waardes zien maar een hoop blokjes en streepjes. Als ik een digitalWrite, high of low op de motor toepas heb ik dit probleem niet. Kan iemand me uitleggen hoe dat kan? En wat ik hier aan kan doen?
Is dit een hardware probleem? Ik heb de motor extern op een 9 v gesloten circuit zoals hier https://learn.adafruit.com/adafruit-ard ... s/overview

Zodra de analogwrite gaat lopen, gaat de lcd in de mist.
Weet iemand een oplossing?

Advertisement

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

Re: vulmachine

Berichtdoor Koepel » 04 Sep 2016, 13:33

Er kunnen tientallen oorzaken zijn.
Waarschijnlijk iets met: breadboard en ground currents en te weinig decoupling en voltage drops.
Die displays zijn heel gevoelig voor elektrische stoorsignalen. Daar staan ze om bekend. Misschien kun je het display al in de war sturen door de vonkjes binnenin de motor als je motor tegen het display houdt.

Heb je het LCD display via een breadboard aangesloten ?
En zit er ook iets van de motor sturing op het breadboard ?
Dat gaat al snel fout. Het beste is om die twee te scheiden op twee aparte breadboards.

Kan de ground current van de motor op de een of andere manier de Arduino beïnvloeden ?

Misschien kun je bij de power supply voor de motor een extra elco plaatsen. Heb je wel een goede flyback diode ? Desnoods twee flyback diodes, als er lange draden tussen de driver en de motor zitten.

Hoe krijgt het Arduino board zijn power ? Alleen via de USB ? Met een slechte USB kabel kan de spanning te laag zijn. De goedkope LCD displays hebben graag 5.0V, en niet 4.5V.

Als je een paar foto's maakt, en de sketch laat zien, en de spanningen meet, dan kunnen we beter helpen.

De Arduino is trouwens niet bedoeld voor een industriële omgeving. Het Arduino board is nauwelijks beveiligd tegen spanningspieken en zo. Het is alleen voor wat testen en prototyping.

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

Re: vulmachine

Berichtdoor shooter » 04 Sep 2016, 19:30

hoe heb je de motor aangesloten, zit daar een driver tussen (ofwel een transistor of zo, en waar komt de voeding vandaan, die KAN NOOIT vanuit de arduino komen want dan loopt er te veel stroom.
paul deelen
shooter@home.nl

Berichten: 4
Geregistreerd: 28 Aug 2016, 21:23

Re: vulmachine

Berichtdoor Balinas » 05 Sep 2016, 11:11

Bedankt voor de snelle reacties!
Ik hieronder een tweetal foto's geplakt en in de pdf gestopt en de code onderaan dit bericht geplakt.
Ik heb de stroom vanuit een 9 volt batterij naar motortje lopen.
Ook als het motortje niet loopt geeft de lcd storing.
Ook wanneer de 9 volt batterij en de motor zijn losgekoppeld geeft de lcd storing.
Ik heb de indruk dat er iets misgaat bij de MOSFET en de analogWrite.
Kan het zijn dat de analogWrite stoort omdat er analoge pin gebruikt wordt voor de weegschaal? Ik gebruik de analogWrite om de middels PWM de motor variabel te laten draaien naar gelang gewicht.
Maar als ik ipv analogWrite digitalWrite en pin High of LOW zet stoort hij ook.

LCD zit op een breadboard samen al het andere behalve de HX711.
Als ik de Mosfet, de motor en de 9 volt batterij loskoppel geeft hij geen probleem.
Als ik de motor en de 9 volt aansluit maar de mosfet niet is er geen probleem.
Mosfet is dus het probleem van de storende lcd?
Ik heb zo'n vermoeden. Wat denken jullie?

cpp code
*/

#include <HX711.h>
#include <LiquidCrystal.h>

// --------------------------------------------------------------------------
// Constants
// --------------------------------------------------------------------------
const int USER_WAIT_DELAY_MS = 10000; // 10 seconds
const int USER_DISPLAY_DELAY_MS = 3000; // 3 seconds
const int USER_DISPLAY_DELAY_MS_FAST = 1000; // 1 seconds
const float CALIBRATION_WEIGHT_GRAMS = 50.0f; // 50 grams

const float WEIGHT_THRESHOLD_SLOW_MOTOR_GRAMS = 40.0f;
const float WEIGHT_THRESHOLD_STOP_MOTOR_GRAMS = 50.0f;

const int DC_MOTOR_PIN_NUMBER = 6;

const int MOTOR_SPEED_STOP = 0;
const int MOTOR_SPEED_LOW = 50;
const int MOTOR_SPEED_HIGH = 100;

// --------------------------------------------------------------------------
// Hardware configuration
// --------------------------------------------------------------------------

LiquidCrystal LCD(12, 11, 5, 4, 3, 2);
HX711 Scale (A1, A0);

// --------------------------------------------------------------------------
// Functions
// --------------------------------------------------------------------------

void setup_serial()
{
Serial.begin(38400);
}

void setup_lcd()
{
Serial.println("Setup LCD");
LCD.begin(16, 2);
LCD.clear();
}

void setup_scale()
{
Scale.power_up();
}

float calculate_calibration_factor()
{
Serial.println("Calibrating Scale");

// message
LCD.clear();
LCD.print("Calibrating Scale");
LCD.setCursor(0, 1);
LCD.print("1: Apply no weight!");

// wait for user to comply
delay(USER_WAIT_DELAY_MS);

// setup scale
Scale.set_scale();
Scale.tare();

// message
LCD.clear();
LCD.print("Calibrating Scale");
LCD.setCursor(0, 1);
LCD.print("2: Put on ");
LCD.print(CALIBRATION_WEIGHT_GRAMS);
LCD.print(" g");

// wait for user to comply
delay(USER_WAIT_DELAY_MS);

// read raw
float avg_value = Scale.get_value(20);

// calculate scaling factor
float scaling_factor = avg_value / CALIBRATION_WEIGHT_GRAMS;

// message
LCD.clear();
LCD.print("Calibrate Scale");
LCD.setCursor(0, 1);
LCD.print("3: Factor = ");
LCD.print(scaling_factor);

Serial.print("Scaling factor = ");
Serial.println(scaling_factor);

// keep message for a few seconds
delay(USER_DISPLAY_DELAY_MS);

// message
LCD.clear();
LCD.print("Calibrating Scale");
LCD.setCursor(0, 1);
LCD.print("4: Remove Weight!");

// keep message for a few seconds
delay(USER_DISPLAY_DELAY_MS);

return scaling_factor;
}

void calibrate_scale(float scaling_factor)
{
// message
LCD.clear();
LCD.print("Setting up Scale");
LCD.setCursor(0, 1);
LCD.print("Factor = ");
LCD.print(scaling_factor);
Serial.println("Setting up Scale");
Serial.print("Factor = ");
Serial.println(scaling_factor);

// set scale-factor for converting raw value to units of gram
Scale.set_scale(scaling_factor);

// reset the scale to 0
Scale.tare();

// keep message for a few seconds
delay(USER_DISPLAY_DELAY_MS);
}

// --------------------------------------------------------------------------
// setup()
// --------------------------------------------------------------------------
void setup()
{
// set pin for DC motor as output
pinMode(DC_MOTOR_PIN_NUMBER, OUTPUT);

// and make sure the motor is stopped by default
digitalWrite(DC_MOTOR_PIN_NUMBER, MOTOR_SPEED_STOP);

// setup serial, lcd and scale
setup_serial();
setup_lcd();
setup_scale();

// make sure scale is calibrated
float scaling_factor = calculate_calibration_factor();
// alternatively, if you want to skip the calibration steps, you can also
// set the scaling factor directly by using the value printed at the end of
// the calibration steps:
//float scaling_factor = 236;
calibrate_scale(scaling_factor);

// starting message
LCD.clear();
LCD.print("Starting Main Loop");
Serial.println("Starting Main Loop");

// keep message for a few seconds
delay(USER_DISPLAY_DELAY_MS);
}

// --------------------------------------------------------------------------
// Loop()
// --------------------------------------------------------------------------
void loop()
{
// read average value corrected to units
float current_scale_value = Scale.get_units(10);

// print to display
LCD.clear();
LCD.print(current_scale_value);
LCD.print(" gram");
Serial.print("gram");
Serial.println(current_scale_value);

// display message for a short while
delay(USER_DISPLAY_DELAY_MS_FAST);

// check scale values and act accordingly
if (current_scale_value > WEIGHT_THRESHOLD_STOP_MOTOR_GRAMS)
{
LCD.setCursor(0, 1);
LCD.print("STOP MOTOR!");
Serial.println("STOP MOTOR!");
digitalWrite(DC_MOTOR_PIN_NUMBER, MOTOR_SPEED_STOP);
//digitalWrite (DC_MOTOR_PIN_NUMBER, LOW);
}
else if (current_scale_value > WEIGHT_THRESHOLD_SLOW_MOTOR_GRAMS)
{
LCD.setCursor(0, 1);
LCD.print("SLOW MOTOR!");
Serial.println("SLOW MOTOR!");
analogWrite(DC_MOTOR_PIN_NUMBER, MOTOR_SPEED_LOW);
//digitalWrite (DC_MOTOR_PIN_NUMBER, LOW);
}
else // current_scale_value < WEIGHT_THRESHOLD_SLOW_MOTOR_GRAMS
{
LCD.setCursor(0, 1);
LCD.print("FAST MOTOR!");
Serial.println("FAST MOTOR!");
analogWrite(DC_MOTOR_PIN_NUMBER, MOTOR_SPEED_HIGH);
// digitalWrite (DC_MOTOR_PIN_NUMBER, HIGH);
}

// display message for a short while
delay(USER_DISPLAY_DELAY_MS_FAST);
}

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

Re: vulmachine

Berichtdoor Koepel » 05 Sep 2016, 12:09

Je sketch ziet er heel goed uit. 10 van de 10 punten :D
Een breadboard zorgt heel vaak voor problemen, vooral als sensoren of displays met weinig stroom worden gecombineerd met motor drivers met veel stroom.

De verbinding tussen het metaal in een breadboard en een stukje draad is vaak niet zo goed. Het kan dus zijn dat de GND van de Arduino naar het breadboard een slechte verbinding is.

Heb je een weerstand van de Arduino pin 6 naar de mosfet ? De gate van een mosfet is een soort condensator. Bij sommige mosfets is het wel 1nF. Dus zonder weerstand knalt de stroom door de draden om die 1nF te vullen.

Heb je de 5V op het breadboard ontkoppeld ? Zet eens een 100nF plus nog een elco op de 5V en GND.

Hoe zit het met de flyback diode ?

Hoe dan ook, het LCD display en de mosfet voor de motor kunnen beter niet op hetzelfde breadboard. Dat geeft heel snel problemen.

Berichten: 4
Geregistreerd: 28 Aug 2016, 21:23

Re: vulmachine

Berichtdoor Balinas » 06 Sep 2016, 11:26

ha met de weerstand is het gelukt! Geen storingen meer op het LCD en toch alles op het breadboard.
Enfin, ik ga proberen de setup zo te doen dat alles gescheiden loopt en mooi gesoldeerd op een printplaatje komt.
Super bedankt voor de tip!

Je noemde nog even dat het niet geschikt is voor industrieel gebruik. Waarom is dat? Tegen welke problemen loop je dan op?
En is er eventueel een alternatief Arduino achtig systeem wat beter geschikt en duurzamer zou zijn?

zie hier het resultaat: iets naar beneden scrollen...https://www.facebook.com/hettheezaakje/

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

Re: vulmachine

Berichtdoor nicoverduin » 06 Sep 2016, 11:51

Om een industriële kwaliteit te halen moeten de ingangen beveiligd zijn tegen te hoge spanningen, vonken, Statische electriciteit enz. Vaak worden de ingangen optisch gescheiden. Een optokoppelaar heeft meestal minimaal een paar kV galvanische scheiding. De uitgangen worden als het niet een relais schakeling is, eveneens beveiligd. De CPU kan dus niet een optater van buitenaf krijgen. als optische koppeling niet mogelijk is gebruik ik altijd BAV99 (smd reversed polarized diodes) en een current limit weerstand. Beiden zorgen ervoor dat zowel negatieve als te hoge positieve spanningen geen schade kunnen aanrichten. Dit voor o.a. analoge spanningen.
Er zijn arduino style PLC's op de markt. Die halen die norm wel. Google er maar eens op.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

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

Re: vulmachine

Berichtdoor Koepel » 06 Sep 2016, 11:59

De microcontroller (de programmeerbare chip zelf) van een Arduino board zit met zijn pinnetjes verbonden aan de pinnen van het Arduino board. Gewoon zo, zonder wat, zonder beveiliging.

Diezelfde microcontroller wordt natuurlijk ook in allerlei apparaten gebruiken, maar dan zitten er componenten omheen ter beveiliging. Dat zijn meestal weerstanden en RC of LC filters, of opto-couplers als het er echt op aan komt zoals nicoverduin schrijft.
Je kunt natuurlijk het Arduino board ook zelf beveiligen. Zodra er iets aan een pin zit, al is het maar een los stukje draad, dan bijvoorbeeld een weerstand of RC filter aan die pin. En ook de voedingsspanning beveiligen tegen spanningspieken.

De officiële Arduino boards hebben goede kwaliteit componenten.
De allergoedkoopste Arduino clones van Ebay of AliExpress hebben de aller-aller-allergoedkoopste componenten, dat is een extra risico (maar wel lekker goedkoop ;) om iets uit te proberen).

Er bestaat een "Ruggeduino" http://www.rugged-circuits.com/ruggeduino/. Dat vind ik overdreven en met zoveel extra componenten op het board is de kans ook groter dat er iets stuk gaat :shock: Het is beter dat je zelf weet van spanningspieken, en elektrische pulsen en grounding problemen en daar zelf wat aan doet.

Heeft een professionele programmeur de code gemaakt ? Geen wonder dat ik het 10 van de 10 punten gaf :D

Ik ben erg benieuwd naar het schema en de componenten die je gebruikt.
Een schema kan een tekening met een pen op een stuk papier zijn, en daar een foto van maken.

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

Re: vulmachine

Berichtdoor shooter » 06 Sep 2016, 15:06

nou ik geef het programma een stuk minder hoor. Er staan een hoop delay in waardoor de nauwkeurigheid of de snelheid erg laag wordt.
Desondanks wel een leuk project, en uitbreiden met een schijf waar je de zakjes aanhangt, zodat vullen en opzetten tegelijk kan.

Vaak wordt er al een hoeveelheid in de zak gedaan voor dat het bijvullen gebeurt, dan gaat het een stuk sneller.
Persoonlijk zou ik 2 voedingen gebruiken, helemaal los van elkaar, want die HX711 is erg gevoelig voor spanningen.
paul deelen
shooter@home.nl

Berichten: 4
Geregistreerd: 28 Aug 2016, 21:23

Re: vulmachine

Berichtdoor Balinas » 06 Sep 2016, 15:41

In reactie op die laatste reactie van 'shooter' (over de delays in sw): Daar ben ik het inderdaad helemaal mee eens, zou geheel anders opgelost moeten worden, maar de software zelf is ook alleen maar een prototype zo snel mogelijk een proof-of-concept te realiseren en iets te hebben om mee verder te kunnen. Nu kan er alvast met de opstelling worden geëxperimenteerd en kunnen we een idee krijgen van wat er allemaal kan, niet kan, en wat er nog gewenst is.

Volgende

Terug naar C code

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 5 gasten