arduino aansturing met bleuthoot

Dat heeft verder geen effect omdat het laatst ingelezen karakter een zogenoemd null-character is wat de verzonden string afsluit, en dus niet overeenkomt met één van de selectie karakters om een relais om te schakelen.
Een kleine correctie: het afsluit karakter dat via de seriële monitor verzonden wordt is het regelterugloop karakter (ASCII code 13), niet het nul karakter (ASCII code 0). Maar dat heeft hetzelfde effect, géén invloed op de relaisstanden.
 
Ik hoop dat ik niet verveel, maar ik heb eens geëxperimenteerd met de SoftwareSerial library.
Met een USB_UART converter aangesloten aan pins 2 en 3, en deze schets:
Schermafbeelding 2022-01-28 om 16.11.54.png

kan ik verbinding maken met de standaard arduino monitor in de pc, alles werkt zoals eerder.
Het duurde wel even totdat ik ontdekte dat je de Tx van de converter op de Rx pin van de arduino moet steken, en andersom :rolleyes:

Het uploaden van de sketch gaat niet op deze manier, maar moet met de "gewone" USB verbinding, wat wel een beetje te verwachten is.

Op deze manier moet het dus ook mogelijk zijn om de Bluetooth module aan pins 2 en 3 te verbinden, en (hopelijk) tegelijk de gewone USB verbinding met Serial.xx met de pc te laten communiceren en uploads te doen.

Wat ik ook veranderd heb is dat ik de while aan het begin van de loop, waardoor de loop daar bleef hangen zodra er geen input was, weggehaald heb, zodat de loop altijd doorloopt. Dit lijkt me toch de betere optie zodat je later zaken als eindschakelaars voor de spindels in de code kan verwerken, en daarvoor dus ook Hall-sensors kunt gebruiken.
Gewone microswitches voor dat doel kun je echter ook in de verbinding naar de relaismodule verwerken, maar met deze code behoud je beide mogelijkheden.

( // Serial.begin (9600); in regel 17 is een overblijfsel, en kan eruit.)
 
Laatst bewerkt:
alle hulp en tips zijn welkom en worden zeker gewaardeerd, ik ben niet iemand die snel ergens iets kopieert en daarna klaar.
De boel effe doorgronden duurt wel langer maar dan weet je tenminste wat je aan het doen bent.
Voor volgende heb ik het relais bord terug verwijderd en de L293D rechtstreeks op de arduino geplaatst.
Ondertussen ergens een code samengeraapt uit enkel vb, deze werkt maar ik kan het gegeven " String iS" "; niet plaatsen, maar zonder werkt het niet ( zie voorbeelden)
motortest2 deze werkt
//motortest2
char t;
String iS="";
#include <AFMotor.h>

AF_DCMotor motor1(1);
AF_DCMotor motor2(2);
AF_DCMotor motor3(3);
AF_DCMotor motor4(4);

void setup()
{
motor1.setSpeed(255);//Can be set from 0-255
motor2.setSpeed(255);
motor3.setSpeed(255);
motor4.setSpeed(255);

motor1.run(RELEASE);
motor2.run(RELEASE);
motor3.run(RELEASE);
motor4.run(RELEASE);
Serial.begin(9600);
}

void loop()
{
if(Serial.available()){
while(Serial.available())
{
char iC = (char)Serial.read();
iS += iC;
}
while (Serial.available() > 0)
{ t = Serial.read() ; }
if(iS == "f"){ //To move forward
motor1.run(FORWARD);
}
else if(iS == "b"){ //To move backward
motor1.run(BACKWARD);
}
else if(iS == "s"){ //To stop
motor1.run(RELEASE);
}
iS = "";
} }


Motortest3 deze werkt dus niet :(
//motortest3
char t;

#include <AFMotor.h>

AF_DCMotor motor1(1);
AF_DCMotor motor2(2);
AF_DCMotor motor3(3);
AF_DCMotor motor4(4);

void setup()
{
motor1.setSpeed(255);//Can be set from 0-255
motor2.setSpeed(255);
motor3.setSpeed(255);
motor4.setSpeed(255);

motor1.run(RELEASE);
motor2.run(RELEASE);
motor3.run(RELEASE);
motor4.run(RELEASE);
Serial.begin(9600);
}

void loop()
{
if (Serial.available()) { // bleuthoot aansturing lezen en printen
t = Serial.read();
Serial.println(t);
}

if(t == "f"){ //To move forward
motor1.run(FORWARD);
}
else if(t == "b"){ //To move backward
motor1.run(BACKWARD);
}
else if(t == "s"){ //To stop
motor1.run(RELEASE);
}

}

Ben nog aan het testen via seriele monitor , dus zonder de H06 ( ik doe het liever stap voor stap, zodat ik het wat beter begrijp)
vgr Marc
 
Het is wel een gok maar makkelijk te testen: Enkele quotes in de if / else if:
if(t == 'f'){ //To move forward

Enkele quotes bij een char, dubbele bij een string.
 
En het zit in een klein hoekje .
de "char" die ik gebruik is niet voldoende, het moet blijkbaar een "int zijn"
de code

#include<AFMotor.h>
AF_DCMotor motor1(1);
int t;
void setup()
{
Serial.begin(9600);
motor1.setSpeed(255); // motor snelheid tussen0 tot 255
}
void loop() {
if (Serial.available()) { // bleuthoot aansturing lezen en printen
t = Serial.read();
Serial.println(t);
}
if(t=='1') // vooruit
{
motor1.run(FORWARD);
}
if(t=='2') // achteruit
{
motor1.run(BACKWARD);
}
if(t=='3') //stop
{
motor1.run(RELEASE);
}
}

tot een volgende stap,
vgr Marc
 
maar ik kan het gegeven " String iS" "; niet plaatsen
Hier zit er een space tussen de quotes, maar in de code is het correct zonder gedaan. Dit is de initiëring van een String type variabele, met als begin een "lege" string.

In het eerste stuk code van jou zit een sectie die van de binnengekomen karakters in de buffer een string maakt, door met een while loop de verschillende karakters aan elkaar te breien. Het verbaast me dat dat met een simpel iS += iC kan, ik zou verwachten dat dat een optelling van de ASCI-codes opleveren zou, met een heel andere uitkomst. Maar wie weet...
Mij lijkt het onnodig om een string te gebruiken als je toch alleen maar enkele karakters stuurt om een actie te bewerkstelligen, wat je zelf ook al aangeeft in de 2e code.
Waarom je hierbij opeens een int type nodig hebt is mij niet helemaal duidelijk, ook cijfers hebben een ASCI-code. Alleen is dat voor "2" getalwaarde 50 in plaats van 2, ik denk dus dat het aan de manier ligt waarmee de seriële monitor van arduino de invoer "vertaalt" voordat het verzonden wordt. Ik zou bij letters en char type blijven, dan heb je tenminste 26 invoermogelijkheden i.p.v. 10 ;)

Ik heb de AFmotor.h library nog niet opgezocht, maar ik zie dat je maar één pin per motor hoeft te definiëren, terwijl vooruit/stop/achteruit toch 3 verschillende gevallen zijn waarvoor je minstens 2 aansluitingen nodig hebt. Ook in het datasheet van de L293 is dat te zien.
 
ter aanvulling van miijn laatste schets.
als ik in de seriele monitor 1-2 of 3 typ geeft de uitgang wat anders weer.
bij invoer1 word dat 49 en 10 ( onder elkaar )
bij - 2 50 en 10
bij - 3 51 en 10

deze avond nog even verder testen als ik meerdere motoren koppel ;)
vgr Marc
 
2de aanvulling
als ik " a-z-e gebruik ipv 1-2-3 voor- achter- stop
bij a 97
10
bij e 101
10
bij z 122
10
bij e 101
10
 
als ik in de seriele monitor 1-2 of 3 typ geeft de uitgang wat anders weer.
bij invoer1 word dat 49 en 10 ( onder elkaar )
bij - 2 50 en 10
bij - 3 51 en 10
Dat klopt dus met de ASCI-code, ik begrijp dan nog steeds niet waarom een char type voor t niet werkt.
(10 is de code voor een nieuwe regel)
 
Ik heb de AFmotor.h library nog niet opgezocht, maar ik zie dat je maar één pin per motor hoeft te definiëren, terwijl vooruit/stop/achteruit toch 3 verschillende gevallen zijn waarvoor je minstens 2 aansluitingen nodig hebt. Ook in het datasheet van de L293 is dat te zien.
Ik heb de library bekeken, maar dat wordt te ingewikkeld voor mij. Ik lees in de beschrijving van het L293 shield wel dat de AFmotor.h library verplicht gebruikt moet worden, dus de pins van de arduino zullen daar ook wel in gedefinieerd zijn.

AF_DCMotor motor1(1); blijkt dus de instance-definitie voor de library te zijn.

EDIT: mijn (jouw) code zoals ik in post #15 liet zien werkt dus gewoon met een char type en 1 of 2 als input!?
 
Laatst bewerkt:
ondertussen de int terug vervangen door char :confused:
en het blijft werken, vreemd , zal dus wel iets fout gedaan hebben al weet ik niet wat ....
 
Heb je hier misschien iets veranderd in de monitor?
Schermafbeelding 2022-01-29 om 11.44.55.png


Als je hier "geen regeleinde" kiest wordt er dus maar 1 input karakter verzonden. Dit blijft dan in de loop zitten, waardoor de actie in de if/else if sectie steeds weer opnieuw gestart wordt. Afhankelijk van hoe de library opgezet is, bijvoordeeld met een slow start of een delayed start kan dat tot vreemde resultaten leiden.

Bij een wisselopdracht zoals bij een verlichtingsrelais wordt het ook leuk, dan gaat die "flipperen" doordat er bij elke voorbijgang van de loop een wissel is.

Altijd één van de regeleinde-mogelijkheden kiezen dus.
 
Ik ben geen voorstander van het gebruik van een "shield" welke alleen maar werkt met een bijbehorende "onbegrijpelijke " ( voor mij dan) library. Ik hou liever het overzicht met een kale chip of op zijn hoogst een simpel te begrijpen module.
Ik heb in samenwerking met MBF collega-modelbouwer @Peter58 een arduino spindelaandrijving opgezet voor zijn bootkraan, gebruikmakend van een TB6612FNG chip. In dat geval werd de aansturing met een reguliere zender/ontvanger gedaan:

Code:
  if (pulseA > 1550) {
    if ((millis() - reversedelay) > lasttimeRA) {
      snelA = map ( pulseA, 1550, rxmax, 0, 255); // vertaal de input (zenderknuppel voorwaarts) naar het output PWM bereik
      motA1 = 1;
      lasttimeFA = millis();
    }
    else motA1 = 0;
    motA2 = 0; // output is LOW.
    instopvlagA = false;
  }
  else if (pulseA < 1450) {
    motA1 = 0; // output is LOW.
    if ((millis() - reversedelay) > lasttimeFA) {
      snelA = map ( pulseA, 1450, rxmin, 0, 255); // vertaal de input (zenderknuppel achterwaarts) naar het output PWM bereik
      motA2 = 1;
      lasttimeRA = millis();
    }
    else motA2 = 0;
    uitstopvlagA = false;
  }
  else {
    motA1 = 0; // output is LOW.
    motA2 = 0; // output is LOW.
    lasttimeFA = millis();
    lasttimeRA = millis();
  }
De chip aansturen is vrij eenvoudig, twee pinnen waarvan één op laag gezet wordt, en de andere op hoog, of omgekeerd, om de draairichting te bepalen. Een derde pin krijgt een PWM signaal om de snelheid te manipuleren. De eindschakelaars integreren en voorkomen dat de motor te snel van voorwaarts naar achterwaarts omschakelt is weer wat anders.......

Voor zover ik van Peter begrepen heb werkt alles naar behoren, dus nu nog even naar bluetooth ombouwen :eek:;) (al zie ik nog niet of en hoe je daar een proportioneel signaal kan genereren)
 
Laatst bewerkt:
Heb je hier misschien iets veranderd in de monitor?
Bekijk bijlage 478733

Als je hier "geen regeleinde" kiest wordt er dus maar 1 input karakter verzonden. Dit blijft dan in de loop zitten, waardoor de actie in de if/else if sectie steeds weer opnieuw gestart wordt. Afhankelijk van hoe de library opgezet is, bijvoordeeld met een slow start of een delayed start kan dat tot vreemde resultaten leiden.

Bij een wisselopdracht zoals bij een verlichtingsrelais wordt het ook leuk, dan gaat die "flipperen" doordat er bij elke voorbijgang van de loop een wissel is.

Altijd één van de regeleinde-mogelijkheden kiezen dus.

kan me inderdaad herinneren dat ik per ongeluk ergens verkeerd had geklikt, en dit terug gewijzigd naar wat ik dacht dat er stond, zeer waarschijnlijk dus NIET.
nogmaals, bedankt om mee te denken, wat we nu hebben had ik op mijn eentje waarschijnlijk pas bereikt over een maand.
De gedachten dat ik tegen de zomer eindelijk dit schip werkend zal hebben geeft me echt wel de moed om nu verder te gaan tot het einde, al zal het wegens prive redenen niet altijd even vlot gaan.
 
Goed, na wat overleg achter de schermen met Marc ga ik hier verder om mijn ideeën hier in dit draadje te proppen :). Het zal beslist niet de enige manier van aanpak zijn, maar kan misschien als katalysator dienen.

Ten eerste ga ik uit van het gebruik van de TB6612FNG motor controlemodule die ik hierboven liet zien, simpelweg omdat het een van de weinige is waar ik een beetje inzicht in de werking ervan heb, en ervaring "op afstand" via het project samen met Peter58. Daarbij worden per motor 3 pins aangestuurd, IN1, IN2 voor draairichting en stop, en PWM voor de snelheidsinstelling. De STBY pin wordt continue op H gezet, en is verder niet nodig. IN1/2 worden met een digitalWrite statement aangestuurd, PWM wordt met analogWrite met een waarde tussen 0 en 255 aangestuurd. Let erop dat niet alle pins met PWM overweg kunnen, en dat varieert per type arduino bord.

Verder heb ik een soort "zendprotocol" bedacht voor de codes die via de seriële poort ontvangen worden. Dit is maar een keuze, en de arduino code kan met gemak aan een ander protocol aangepast worden:
- een enkele kleine letter a,b,c,... enz. voor de typische aan/uit wisselfuncties, bijvoorbeeld verlichting, brandwaterpomp enz.
- een getal 0 t/m 9 voor de motoren die volgens bovengenoemde controlemodule aangestuurd worden, gevolgd door een hoofdletter als tweede karakter òf een cijfer 0 tm 9, met de volgende betekenissen.
- voor motor nummer 1: 1V is draairichting vooruit, 1S is stop, 1A is draairichting achteruit, 13 is snelheid 3, 17 is snelheid 7.
Om de snelheidsinstelling te vereenvoudigen is het bereik 0 t/m 255 in 9 vaste snelheden verdeeld, 0 = 0, 1 = 29, 2 = 58, etc. (9 = 255 i.p.v.261 om niet buiten het bereik te komen).

Het eerst-binnenkomende karakter wordt uitgelezen op de inmiddels bekende manier, is het een herkend cijfer dan wordt er een tweede karakter uitgelezen. Aan het einde van de code wordt de rest van de aanwezige karakters uit de serial buffer uitgelezen en gedumpt.

IN1 en IN2 zijn de IN pins, spd is de PWM pin. De output pins ontbreken nog.

Code:
/*
 * Geen gecombineerde opdrachten mogelijk, buffer wordt gewist aan einde loop
 * cijfer eerst voor motor controle
 * tweede karakter V=vooruit, A=vooruit, S=stop, cijfer=snelheid (0-9)
 */

bool SCHAKEL1;
bool SCHAKEL2;
bool IN1 = 0, IN2 = 0;

int spd = 0;

char t;
char mc;

void setup() {
 
  Serial.begin(9600);
  pinMode(14, OUTPUT); // relais 1
  pinMode(15, OUTPUT); // relais 2
 
  digitalWrite(14, HIGH); //relais off
  digitalWrite(15, HIGH); //relais off
 
  SCHAKEL1 = true;
  SCHAKEL2 = true;

}

void loop() {
 
  if (Serial.available()) {
    t = Serial.read();
    Serial.println(t);
  }

  if (t == '1') {
    mc = Serial.read ();
    if (mc == 'V') {
      IN1 = 1;
      IN2 = 0;
    }
    if (mc == 'A') {
      IN1 = 0;
      IN2 = 1;
    }
    if (mc == 'S') {
      IN1 = 0;
      IN2 = 0;
    }
    if (mc > 47 && mc < 58) { // cijfer karakters 0 t/m 9
    // bereken speed output in stappen van 29, gebaseerd op cijfer-karakter 0 (=0) tot 9 (=261).
      spd = (mc - 48)*29;
      if (spd > 255) spd = 255;
    }

    Serial.print ("   "); Serial.print (mc); Serial.print ("   ");  Serial.print (IN1);
    Serial.print ("   "); Serial.print (IN2); Serial.print ("   ");  Serial.println (spd);
  }
 
  if (t == 'a') {
    SCHAKEL1 = !SCHAKEL1; // true wordt false of false wordt true
    digitalWrite (14, SCHAKEL1);
  }

  if (t == 'b') {
    SCHAKEL2 = !SCHAKEL2;
    digitalWrite (15, SCHAKEL2);
  }

  do {  // maak buffer leeg met do..while loop
    Serial.read();
  } while (Serial.available()>0);
 
  //Serial.print (SCHAKEL1); Serial.print ("     "); Serial.println (SCHAKEL2);
  t = 0;
  mc = 0;
  delay (200);

}

Edit: "snelheidsgroepen" eruitgehaald, beetje misleidende benaming voor een vaste snelheid...
 
Laatst bewerkt:
[QUOTE="
Voor zover ik van Peter begrepen heb werkt alles naar behoren, dus nu nog even naar bluetooth ombouwen :eek:;) (al zie ik nog niet of en hoe je daar een proportioneel signaal kan genereren)[/QUOTE]

ik merk wel op dat in MITapp je de mogelijkheid bestaat om een schuifregelaar te plaatsen ipv een knop. Misschien dat deze de mogelijkheid bied, maar moet dit even verder onderzoeken, snelheid van de motoren aanpassen zou natuurlijk een pluspunt kunnen zijn.
 
Als je er aan toekomt om mijn laatste hersenspinsel te lezen zul je zien dat ik dat voorlopig opgelost heb door 9 vaste snelheden te kiezen binnen het spectrum van 0-255 (= stop tot maximum snelheid).
 
Het werkt, ook de motoren!

Code:
/*
 * Geen gecombineerde opdrachten mogelijk, buffer wordt gewist aan einde loop
 * cijfer eerst voor motor controle
 * tweede karakter V=vooruit, A=vooruit, S=stop, cijfer=snelheid (0-9)
 */

bool SCHAKEL1;
bool SCHAKEL2;

int spd = 0;

char t;
char mc;

void setup() {
 
  Serial.begin(9600);
  pinMode(5, OUTPUT); // motorregelaar
  pinMode(6, OUTPUT); // motorregelaar
  pinMode(7, OUTPUT); // motorregelaar
  pinMode(8, OUTPUT); // motorregelaar
  pinMode(9, OUTPUT); // motorregelaar
  pinMode(10, OUTPUT); // motorregelaar
  pinMode(11, OUTPUT); // motorregelaar
  pinMode(13, OUTPUT); // Onboard LED
  pinMode(14, OUTPUT); // relais 1
  pinMode(15, OUTPUT); // relais 2

  digitalWrite(5, HIGH); // motorregelaar, inputs low & PWM high: motor stop, vrij draaiend.
  digitalWrite(6, LOW);
  digitalWrite(7, LOW);
  digitalWrite(8, HIGH);
  digitalWrite(9, LOW);
  digitalWrite(10, LOW);
  digitalWrite(11, HIGH);
  digitalWrite(13, HIGH); //LED uit
  digitalWrite(14, HIGH); //relais uit
  digitalWrite(15, HIGH); //relais uit
 
  SCHAKEL1 = true;
  SCHAKEL2 = true;

}

void loop() {
 
  if (Serial.available()) {
    t = Serial.read();
    Serial.println(t);
  }

  if (t == '1') {
    mc = Serial.read ();
    if (mc == 'V') {
      digitalWrite (7,HIGH);
      digitalWrite (6,LOW);
    }
    if (mc == 'A') {
      digitalWrite (7,LOW);
      digitalWrite (6,HIGH);
    }
    if (mc == 'S') {
      digitalWrite (7,LOW);
      digitalWrite (6,LOW);
    }
    if (mc > 47 && mc < 58) { // cijfer karakters 0 t/m 9
    // bereken speed output in stappen van 29, gebaseerd op cijfer-karakter 0 (=0) tot 9 (=261).
      spd = (mc - 48)*29;
      if (spd > 255) spd = 255;
      analogWrite (5,spd);
    }
  }

  if (t == '2') {
    mc = Serial.read ();
    if (mc == 'V') {
    digitalWrite (9,HIGH);
    digitalWrite (10,LOW);
    }
    if (mc == 'A') {
    digitalWrite (9,LOW);
    digitalWrite (10,HIGH);
    }
    if (mc == 'S') {
    digitalWrite (9,LOW);
    digitalWrite (10,LOW);
    }
    if (mc > 47 && mc < 58) { // cijfer karakters 0 t/m 9
    // bereken speed output in stappen van 29, gebaseerd op cijfer-karakter 0 (=0) tot 9 (=261).
      spd = (mc - 48)*29;
      if (spd > 255) spd = 255;
      analogWrite (11,spd);
    }
  }
 
  if (t == 'a') {
    SCHAKEL1 = !SCHAKEL1; // true wordt false of false wordt true
    digitalWrite (14, SCHAKEL1);
  }

  if (t == 'b') {
    SCHAKEL2 = !SCHAKEL2;
    digitalWrite (15, SCHAKEL2);
  }

  if (t == 'c') PORTB = PORTB ^ B00100000;  // inverteer pin 13

  do {  // maak buffer leeg met do..while loop
    Serial.read();
  } while (Serial.available()>0);
 
  //Serial.print (SCHAKEL1); Serial.print ("     "); Serial.println (SCHAKEL2);
  t = 0;
  mc = 0;
  delay (200);

}

De regel met PORTB enz. is een alternative manier om een output te "flippen".

20220201_192707.jpg


De motortjes hebben een eigen voeding, in dit geval een enkele Li-ion cel. De arduino en de primaire kant van de driver worden hier vanuit de usb aansluiting gevoed.
 
Laatst bewerkt:
Filmpje. ik heb de pins voor de aan/uit schakelingen verplaatst naar 17/18/19. En het laat maar één motor zien, maar ik neem aan dat het duidelijk is dat de tweede motor net zo werkt als je als eerste karakter de 2 kiest.

Ik ga wel nul als de snelheidsinstelling eruithalen, dat leidt tot verwarring samen met de motorstop door code 1S of 2S.

 
Laatst bewerkt:
Back
Top