Hulp bij sequence met electromagneten

Arduino specifieke Software
Berichten: 4
Geregistreerd: 20 Okt 2016, 12:12

Hulp bij sequence met electromagneten

Berichtdoor patrickkasl » 20 Okt 2016, 12:21

Hallo allemaal!

Momenteel ben ik voor een grote expo bezig met een project waarbij ik electromagneten in een sequence op een audiotrack aan wil laten gaan doormiddel van timestamps te gebruiken(bijv: 00:16 aan, 00:40 aan). Deze audiotrack duurt net iets langer dan 3 minuten en om dit met de delay functie te doen werkt blijkbaar dus niet na trial en error gemerkt te hebben. Over 2 dagen is de expositie en ik zit nu met een enorme tijdsdruk. De audiotrack ben ik van plan een loop te maken die om de 10 minuten start op mijn laptop, dus los van de arduino i.v.m. dat ik geen andere oplossing hiervoor heb op het moment. Dat is verder geen probleem.

- 2 magneten
- 2 relays

Mijn vraag is: Hoe kan ik de code het beste aanpassen om dit te realiseren?!
Alvast immens bedankt!!!

Code: Alles selecteren
//13e pin krijgt de naam led en is een INT
int mag1 = 6;
int mag2 = 7;

void setup() {
  // put your setup code here, to run once:
  //Selecteer magneten als output
  pinMode(mag1, OUTPUT);
  pinMode(mag2, OUTPUT);;
 
}

void loop() {
  // put your main code here, to run repeatedly:
  delay(2000);
  mag1on();   
  delay(2000);
  mag2on();

 
}
//Magneet 1 aan
void mag1on(){

  digitalWrite(mag2, LOW);
  digitalWrite(mag1, HIGH);
 
  }
//Magneet 2 aan
void mag2on(){

  digitalWrite(mag1, LOW);                       
  digitalWrite(mag2, HIGH);
 
  }

Advertisement

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

Re: Hulp bij sequence met electromagneten

Berichtdoor Koepel » 20 Okt 2016, 12:52

Au! :shock: nog twee dagen, dat gaat zeer doen.

De delay() functie doet iedere keer hetzelfde dus het kan nauwkeurig zijn, maar om iets op een bepaalde tijd te doen, is er millis() en misschien de TimeAlarms library.

millis() : https://www.arduino.cc/en/Reference/Millis
TimeAlarms : https://www.pjrc.com/teensy/td_libs_TimeAlarms.html

Met millis() gaan werken kost een tijdje om er aan te wennen. Het gebruik van millis() is echter wel hetzelfde als timestamps maken.

Een Arduino met een audio shield kan zelf bestanden van een SD geheugenkaartje afspelen. Op die manier is het eenvoudig om het synchroon te laten lopen. Daar is nu echter te weinig tijd voor.

Is het mogelijk om iets te kopen dat een audio ingang heeft en de relais aanstuurt ?
Kun je op de computer een script schrijven dat de audio start en commando's via de usb (als serial port) naar de Arduino stuurt ? Dan is de Arduino alleen maar om uitgangen aan te sturen. Ken je scripts voor PowerShell, Bash, Python, Perl, of iets anders die dat kan ?
Kun je een Arduino sketch met millis() en een sequence tabel uit je mouw schudden ? Hoe ga je dan de Arduino synchroniseren met het geluid ?

Als je een snelle oplossing maakt, zorg dan voor een tweede werkende oplossing achter de hand. Want op zo'n korte termijn zal er best iets verkeerd gaan.

Des te meer informatie je geeft, des te beter en sneller dat wij kunnen helpen. Wat gebruik je om de relais aan te sturen (graag een link naar het product). Welk Arduino board ? Welke relais als je losse relais gebruikt. Hoe lang moet een relais aktief blijven, want je zet ze nu alleen maar aan en nooit uit. Okay, je zet ze uit gedurende 5 µs, maar daar merkt het relais niets van. Wat gebruik je als voeding ? Een aparte adapter ? welke, en hoe ?

Berichten: 4
Geregistreerd: 20 Okt 2016, 12:12

Re: Hulp bij sequence met electromagneten

Berichtdoor patrickkasl » 20 Okt 2016, 13:50

Bedankt voor je snelle reactie! :)

Ik gebruik:

- Arduino Uno R3
- 2 Relay module (http://www.instructables.com/id/Arduino ... nel-Relay/)
- 2 electromagneten met 50kg trekkracht
(https://www.aliexpress.com/item-img/XRN ... 14680.html)
- losse adapter (12v 2,0A)

Ik kan code schrijven maar ben nog alleen bekend met kleinschalig C# code schrijven.
Ik zit wel te denken om een Form te maken en daarin een button te maken die de sequence op de arduino activeert en de audiofile op mijn laptop tegelijkertijd.
Dit moet via serial connecties heb ik gezien, ik ga hier straks naar kijken en hoop dat het probleem van synchroon lopen oplost. Hopelijk is dit niet al te moeilijk en krijg ik dat snel voor elkaar.

Er zijn dus 2 relays, de relay die actief is mag aanblijven totdat de andere aangaat. De bedoeling is dat ze per timestamp om de beurt aangaan.

Zeg het maar als ik iets vergeten ben, ik ben blij met alle hulp :)

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

Re: Hulp bij sequence met electromagneten

Berichtdoor Koepel » 20 Okt 2016, 14:21

Power:
De Arduino krijgt de power van de USB kabel ? En ook het 5V relay board ? Met twee relais zal het goed gaan denk ik.
Hoeveel stroom trekken die magneten ? De relais op het relay board zijn 10A, maar als het heel goedkope zijn, dan kan met 5A de contacten misschien al doorbranden.
Gebruik je de 12V ook voor de Arduino ? Dan misschien je vinger houden op de voltage regulator. De regel is dat als het zo heet is dat je vinger er niet op kunt blijven houden, dat is het te warm.


Kun je iets op de computer maken die iets op bepaalde tijden stuurt naar de seriële poort van de Arduino?
Dan leest de Arduino een teken in, en zet een relais aan en uit. Bijvoorbeeld een '1' is relais 1 aan, en een '2' is relais 2 aan.

Zelf heb ik C# lang geleden eens geprobeerd, maar ben het allang weer vergeten, dus ik weet niet of dat kan. De PowerShell en Bash in linux kunnen dat wel.

Berichten: 4
Geregistreerd: 20 Okt 2016, 12:12

Re: Hulp bij sequence met electromagneten

Berichtdoor patrickkasl » 20 Okt 2016, 14:32

De arduino krijgt stroom van de pc en hierdoor kan ik dan hopelijk ook direct commandos via usb versturen tussen laptop en arduino.
De relays krijgen stroom van een adapter van 12v 2.0a.
De relays worden niet heet maar de magneten wel na een tijd, daarom wil ik na de 3 minuten sequence ook een pauze van 7 minuten geven om ze steeds af te koelen.
De relays zijn van Songle 10a 250vac 10a 125vac 10a 30vdc 10a 28vdc.
Magneten zijn 12vdc.

Slim idee om via de form een sequence te maken die magneet 1 of 2 aan laat gaan. In C# is het misschien veel makkelijker voor me en dan loopt het ook eerder synchroon.
Hopelijk zit er niet teveel lag tussen de laptop en arduino.
Ik ga nu bezig om dit via een form te realiseren. I'll keep u updated, bedankt!

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

Re: Hulp bij sequence met electromagneten

Berichtdoor Koepel » 20 Okt 2016, 19:20

Toch is er nog van alles dat ik niet weet, zoals beginconditie en eindconditie en hoe je het opnieuw start.
Het kan natuurlijk ook in een sketch.
De volgende sketch werkt maar één keer. Door op de reset-knop te drukken gaat hij opnieuw.
Het is behoorlijk "Quick and Dirty", dus ik hoop maar dat andere ervaren forumleden er niet te goed naar kijken :?
Probeer het eens, en open ook de seriële monitor.

Code: Alles selecteren
//
// For: http://arduinoforum.nl/viewtopic.php?f=8&t=2061
// Quick and Dirty
// Using the absolute value of millis(), that is extra low dirty.

const int mag1Pin = 6;
const int mag2Pin = 7;
int nextMag = 1;            // which Mag to activate next time, value is 1 or 2.

// The sequence array
// ------------------
// At start: both relays are off.
// At the time: start with relay 1, next time alternate.
// At NULL: turn off both relays at the last given time.
char *sequence[] =
{
  "00:16", "00:40", "1:11", "02:03", "2:50", "3:00", NULL
};

int index = 0;              // index of the sequence.
unsigned long nextTime;     // next time in milliseconds


void setup()
{
  Serial.begin( 9600);
  Serial.println(F( "\nHere we go."));   // Famous Finnish HPC saying

  pinMode( mag1Pin, OUTPUT);
  pinMode( mag2Pin, OUTPUT);

  // Get the first time when something needs to be done.
  nextTime = GetNewTime( index);
  index++;
}

void loop()
{
  unsigned long currentMillis = millis();

  if( currentMillis >= nextTime)
  {
    // It's time to do something.
    int pinOn, pinOff;
   
    if( nextMag == 1)
    {
      pinOn = mag1Pin;
      pinOff = mag2Pin;
      nextMag = 2;
    }
    else
    {
      pinOn = mag2Pin;
      pinOff = mag1Pin;
      nextMag = 1;
    }

    digitalWrite( pinOn, HIGH);
    digitalWrite( pinOff, LOW);

    Serial.print(F( "On pin "));
    Serial.print( pinOn);
    Serial.print(F( ", Off pin "));
    Serial.print( pinOff);
    Serial.println();

    nextTime = GetNewTime( index);
    index++;
  }
}


// ----------------------------------------
// Retrieve a new time from the sequence.
// Halts if NULL is found.
// ----------------------------------------
unsigned long GetNewTime( int i)
{
  int minutes = 0;
  int seconds = 0;
  unsigned long result = 0UL;

  char *p = sequence[i];
  if( p == NULL)
  {
    // Stop it right here, at the last time in the table.
    digitalWrite( mag1Pin, LOW);
    digitalWrite( mag2Pin, LOW);

    Serial.println(F( "STOP (both pins are Off)"));
    while( true);                // halt forever     
  }
  else
  {
    minutes = atoi( p);
    char *q = strchr( p, ':');   // find seperator ':'
    if( q != NULL)
    {
      q++;                       // advance after ':'
      seconds = atoi( q);
    }
    // calculate the milliseconds from the minutes and seconds.
    result = (seconds * 1000UL) + (minutes * 60UL * 1000UL);

    Serial.print(F( "Waiting for new time "));
    if( minutes < 10)
      Serial.print(F( "0"));
    Serial.print( minutes);
    Serial.print(F( ":"));
    if( seconds < 10)
      Serial.print(F( "0"));
    Serial.print( seconds);
    Serial.print(F( "  ("));
    Serial.print( result);
    Serial.print(F( " ms)"));
    Serial.println();
  }
  return( result);
}

Berichten: 4
Geregistreerd: 20 Okt 2016, 12:12

Re: Hulp bij sequence met electromagneten

Berichtdoor patrickkasl » 20 Okt 2016, 22:14

Superharstikkebedankt!

Ik ben er ondertussen helemaal uitgekomen!
Beetje lullig dat ik je code niet nodig heb, maar ben je uiterst dankbaar.

Ik heb op het moment een form gemaakt waarin ik 2 buttons heb, button 1 start mag1on en button 2 start mag2on.
Nu hoef ik nog alleen een list ofzo te maken waarin ik de sequence gooi en bij de buttonclick de sequence en audio start.

Mijn C# Form code voor geïnteresseerden:

Code: Alles selecteren
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using ArduinoDriver.SerialProtocol;

namespace MagnetForm
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            serialPort1.Open();
        }

        private void btnStart_Click(object sender, EventArgs e)
        {

            serialPort1.Write("A");
           
        }

        private void btnStop_Click(object sender, EventArgs e)
        {

            serialPort1.Write("a");

        }
    }
}


Uiteindelijk is het dus blijkbaar extreem simpel.

Mijn Arduino C++ Code:

Code: Alles selecteren
int data;
int mag1 = 6;
int mag2 = 7;

void setup() {
 
  Serial.begin(9600);
  pinMode(mag1, OUTPUT);
  pinMode(mag2, OUTPUT);
  digitalWrite(mag1, LOW);
  digitalWrite(mag2, LOW);
 
}

void loop() {

  if(Serial.available())
  {
    data = Serial.read();

    if(data == 'A')
    {
      mag1on();
    }
    else
    {
     mag2on();
    }
  }

}

//Magneet 1 aan
void mag1on(){

  digitalWrite(mag2, LOW);
  digitalWrite(mag1, HIGH);
 
  }
//Magneet 2 aan
void mag2on(){

  digitalWrite(mag1, LOW);                       
  digitalWrite(mag2, HIGH);
 
  }

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

Re: Hulp bij sequence met electromagneten

Berichtdoor Koepel » 20 Okt 2016, 22:51

Als het maar werkt ;)

Mag ik nog een opmerking plaatsen ?
Kun je het veiliger maken ? Niet 'A' en 'a', maar liever 'A' en 'B'. En misschien een 'C' om alles uit te zetten. In de Arduino alle andere karakters negeren. Misschien komt er storing mee, of een keer een LineFeed of zo.

Code: Alles selecteren
if(Serial.available())
  {
    data = Serial.read();

    if(data == 'A')
    {
      mag1on();
    }
    else if(data == 'B')
    {
     mag2on();
    }
  }

Heb je nog tijd om te slapen ? Met voldoende slaap kun je beter nadenken, en dat heb je wel nodig om dit binnen twee dagen te doen.

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 70 gasten