circuit accelerometer - vibratie

Ben je zeker dat je zo de x y z waarden kan uitlezen?

Het is heel belangrijk dat je alles heel secuur doet. Dus als je een tekening maakt, dan dubbel controleren. Dan even laten liggen (er een nachtje over slapen) en dan nog eens controleren. Of je vraagt iemand om even te kijken, wat je dus in feite nu gedaan hebt.

Het werkt niet, het werkt niet en het werkt niet als je het mij vraagt.

Daarvoor heb ik naar de beschrijving op de site waarnaar je linkt, het schemaatje dat daar ook staat, en jouw screenshot gekeken.

Het werkt niet omdat je niet de juiste pinnen van de Arduino gekozen hebt. Het werkt niet omdat je schijnbaar de pinnen van de chip, in plaats van de module hebt gekozen. Het werkt niet omdat je niet de juiste pinnen van de module gekozen hebt als je wel de module zou bedoelen.

De Arduino heeft analoge ingangen die van A0 tot A5 gaan, dat zijn er dus 6 in totaal. Die ingangen kunnen ook digitaal gebruikt worden, zelf ook als uitgang. Dan zijn er nog digitale uit en ingangen, die van D0 tot D13 gaan, maar daar is de D niet benoemd. Sommige kunnen hardwarematig een PWM waarde uitsturen, die zijn op je bordje gemarkeerd met een ~ tilde . Soms vergist men zich en noemt men dat analoge uitgangen, maar dat zijn het niet. Deze mogelijkheden moet je wel begrijpen, anders zal het werken erg moeizaam worden.

Ow, nog iets.

Die motoren gaan niet draaien hoor. Zodra je de transistor open zet gaat er niet voldoende stroom door de motor, maar bijna alles gaat door de betreffende diode.

Als je de diode omdraait maak je meer kans.

Bedankt allemaal voor jullie feedback. Door jullie wijze woorden is het mij gelukt om de schakeling in mekaar te knutselen en aan de praat te krijgen! Nu zit ik nog slechts met één vraagje: wat is de gemakkelijkste manier om de uiteinde van het motortje te solderen? Kan dit gewoon op een header pin of is dit niet mogelijk? De uiteinden zien er als volgt uit (zie afbeelding en bijlage) en past dus niet in een breadboard.

mvg

Coin Vibration.png

Als je die draadjes bedoeld.... Er zijn losse header pinnen en houders te koop op o.a. ebay. 't is een beetje een vraag waar je het op wil aansluiten. Er zijn ook 0.1" schroef klemmen te koop. En als het de bedoeling is dat het in een apparaat komt dat in principe nooit meer open hoeft, moet je jezelf afvragen of het de kosten wel waard is om uberhaupt pinnen ed. te gebruiken en niet gelijk gewoon solderen.

Bedankt voor de talrijke nuttige reacties.
Na een beetje gespeeld te hebben met code is het me gelukt om de accelerometer naar mijn wensen te calibreren.

Nu zit ik nog met één vraagje. Indien de accelerometer een bepaalde waarde bereikt (uitwijking) moet de led oplichten. Normaal gezien doe ik dit gewoon met de analogValue die binnenkomt langs de Sensor. Maar omdat deze nu aangepast zijn en omgezet zijn kan ik dit niet gebruiken

Ik weet dat je dit normaliter doet met volgende code in de voide loop ():

if (uitwijking >= 15){
digitalWrite(led1, HIGH);
alse {
digitalWrite(led1, LOW);

Ik weet enkel niet welke variabele ik bij “uitwijking” moet zetten. Ik krijg steeds fouten als ik wat probeer. Omdat de analoge waarden die ik meet zowizo boven de 15 zitten. Maar degene die op de seriële monitor geprint worden niet omdat deze omgevormd zijn.
Hebben jullie hiervoor een oplossing?
De code staat hier onder

const static boolean GFORCE = true;
const static boolean METERS = false;


byte _sleepPin= 4;
byte _GS= 5;
byte _xpin= A0;
byte _ypin = A1;


int _gc = 92;//gravity constant (inverted for proper sinage)
int _0x = 660; //defaults to read values
int _0y = 677; //defaults to reasonable values
boolean _calibrated=false;


int led1 = 10;


void setup()
{
Serial.begin(9600);
begin();//runs setup
calibrate();
pinMode(10, OUTPUT);
}

void loop()
{
delay(3000); //Delay for readability


Serial.println();
Serial.println("In Meters Per Second-Squared:");
readMx();
readMy();


}
void begin()
{
pinMode(_sleepPin,OUTPUT);//output mode
pinMode(_GS,OUTPUT);//output mode
pinMode(_xpin, INPUT);//input mode
pinMode(_ypin, INPUT);//input mode


digitalWrite(_GS,LOW);//sets GS mode
digitalWrite(_sleepPin, HIGH);//turns off sleep mode and activates device
digitalWrite(_xpin, HIGH);//turn on pull up resistor
digitalWrite(_ypin, HIGH);//turn on pull up resistor

}


void calibrate()
{
Serial.println("Please place device right-side up on a flat surface.");
delay(3000);//give user two seconds to comply.
Serial.println("Calibrating");


_0x = readAverage(_xpin, 10);
Serial.print("X Axis Calibrated:"); Serial.println(_0x);
_0y = readAverage(_ypin, 10);
Serial.print("Y Axis Calibrated:"); Serial.println(_0y);

_calibrated = true;
}
int readAverage(int pin, int samples)
{
long readings = 0;

for(int i = 0; i < samples; i++)
{
readings += analogRead(pin);
}

return (readings/samples);
}

float convert(float myReading, float my0G)
{
return convert(myReading, my0G, GFORCE);//defaults to G-Forces
}

float convert(float myReading, float my0G, bool myUnits)
{
float myResult=((my0G-myReading)/(_gc));
if(myUnits)
return myResult; //G-Forces
else
return (myResult * 9.80665 * 10);


//converts to m/s^2 using conventional value for gravity.
//if you are on a different planet you may need to use a
//value for your conversions.
}

void readMx()
{
Serial.print("X Reading: ");
Serial.println(convert(analogRead(_xpin), _0x, METERS));
}

void readMy()
{
Serial.print("Y Reading: ");
Serial.println(convert(analogRead(_ypin), _0y, METERS));
}

Vermoedelijk mis ik nog wat programmeer ervaring, maar:

Ik zie nergens een verwijzing naar uitwijking staan in de code. Ik zie ook nergens iets staan waar je de waarde van je accelerometer binnenhaalt om te verwerken. Ik zie wel dat je de waardes naar serial stuurt.

MAS3: Vermoedelijk mis ik nog wat programmeer ervaring, maar:

Ik zie nergens een verwijzing naar uitwijking staan in de code. Ik zie ook nergens iets staan waar je de waarde van je accelerometer binnenhaalt om te verwerken. Ik zie wel dat je de waardes naar serial stuurt.

Ja ik zou graag werken met de waarden die geprint worden op de seriele monitor maar ik vind de oplossing niet

Mvg

Je haalt die waarden binnen in een functie. De waardes die je daar binnenhaalt, zijn alleen geldig binnen die functie. Daarom lukt de serial print daar dus wel. Ergens anders zijn ze onbekend. En zelfs als je de volgende keer weer terugkeert naar die functie zijn ze alweer vergeten en worden ze opnieuw aangemaakt. Dat word dus uitzoeken hoe je waardes vanuit een functie kunt overdragen naar elders in je sketch. Er word hier in het Engels wat over variabele scope ("blikveld") verteld, ook over het nut van de verschillende varianten.

Voor de geïnteresseerden, het is wel degelijk gelukt.

Gewoon de variabele (convert(analogRead(_xpin), _0x, METERS) in de void loop () gebruiken. Dit blijkt te werken

Gefeliciteerd.

Daarmee is je code vermoedelijk wel behoorlijk veranderd. Wil je die uiteindelijke code ook plaatsen ter leering ende vermaeck ?

Het enige wat ik heb moeten aanmaken in de void loop() is het volgende:

  if ((convert(analogRead(_ypin), _0y, METERS) >= Trigger)){    
    digitalWrite(led1, HIGH);

      }

   else {
  
    digitalWrite(led1, LOW); 
      }

uiteraard moet je de variabelen int Trigger bovenaan nog een waarde geven.

Ik heb een zeer raar probleem.
ik heb de schakeling gebouwd. En als de waarde overschreden wordt trillen de motoren.
om de accelero te calibreren gebruik ik een IR reveiver met remote.

Ni het probleem: ik kan de accelero perfect kalibreren als er geen motor trilt. Als motor1 trilt kan ik de accelero ook kalibreren maar als motor2 trilt lukt het mij niet om te kalibreren…
ik moet wel zeggen dat het 2 verschillende motoren zijn. Zou het kunnen dat ik de stroom door deze motor naar beneden moet halen met een sterkere weerstand?
Ik heb al zoveel proberen veranderen aan mijn code maar hier ligt het probleem niet denk ik.

Heeft iemand een idee?
Alvast bedankt,
Castel

Sorry, ik weet niet of ik nu naar iets vraag dat al gepost is. Maar hoe heb je de motoren precies aangesloten ?

Ik vermoed dat je 2e motor een stoorsignaal genereert. Dat kun je voorkomen met een of twee (een grotere elco van 10 uF ofzo en een kleinere in de orde van 100 nF) op de juiste plaats. Om je te adviseren over de beste plaats is dan een schemaatje van je huidige opzet nodig.

In bijlage vindt u mijn schema.

Ah, zoiets heb ik al eens voorbij zien komen.

Als je nog twijfelt of het aan je code kan liggen, verwissel dan de draden aan pinnen D6 en D9 eens. Wanneer je dan hetzelfde probleem hebt maar nu met motor 1, dan ligt het toch aan je code. Draait het probleem ook om, dan ligt het aan de hardware.

Breadboard / Fritzing tip:

Aan de randen van je breadboard heb je gaten die in de lengte doorverbonden zijn. Die zijn om de voeding te maken en dat heb je ook zo gedaan. Maar er staan ook gekleurde strepen naast de betreffende gaatjes. Je moet het zelf weten, maar de rode kleur is dan bedoeld om VCC (oftewel "de plus") weer te geven, en de blauwe om GND, de "min" weer te geven. Bij bepaalde, wat langere breadbords, kun je ook tegenkomen dat de rode en de blauwe lijn in het midden zijn onderbroken. Dat betekent dat de elektrische doorverbinding daar ook onderbroken is, en dat is een regelrechte valkuil.

Bedankt voor de tip!

Inderdaad, ik heb deze al omgewisseld en nog steeds dezelfde motor had het probleem! Na enig opzoekwerk denk ik dat ik het misschien kan oplossen met een capacitor parallel aan de diode te schakelen?

Update: Ik heb een in capacitor van 10µf parallel aan de diode geschakeld en het werkt nu! Bedankt voor de tip MAS3

Beste castel.

Aangezien het om een ander project en andere hardware gaat, lijkt het me een bijzonder goed idee om hiervoor een nieuw onderwerp te starten. Anders is er een grote kans op verwarring, en anderen die wellicht hebben afgehaakt in deze thread gaan hier dan ook niet meer kijken.