používám driver PCA9685 kterým řídím 6 serv, ale nevím jak je zpomalit při přejezdu z polohy A do polohy B (používám serva MG946R, které napájím externě 7,2V a při tomto napětí se otáčí rychlost cca 60 stupňů/0,15s, což je pro můj projekt příliš rychlé. Jedná se o robotické rameno, kterým pohybuje 6 serv (základna, rameno, předloktí...) a ty jsou ovládány potenciometry, ze kterých je sestaven model tohoto ramene v měřítku 1/2 a ten funguje jako ovladač, něco na principu "voodoo panenky" (co udělá ovladač, tak ihned napodobí i rameno). Všechno to řídím deskou Arduino NANO. Rameno umí ještě nejen jezdit přesně podle ovladače, ale i samo automatický jezdit postupně mezi pozicemi uloženými pomoci tlačítka (ovladačem nastavím pozici, zmáčknu tlačítko a pozice všech 6 serv se uloží do paměti, těchto pozic si to je schopné zapamatovat až 20). Pak je tam druhé tlačítko s aretací, které přepíná z manuálního režimu do automatického, ve kterém rameno jezdí po sepnutí neustále mezi uloženými pozicemi (pohybuje se všech 6 serv zároveň), dokud toto tlačítko opět nevypnu (když ho vypnu, přepne se opět do manuálního režimu) a tu právě nastává ten problém, protože serva se pohybuji mezi těmito pozicemi v automatickém režimu maximální možnou rychlosti a to by znamenalo jistou zkázu, protože rameno měří cca 50cm. (V manuálním režimu není třeba rychlost omezovat, protože je řízena ovladačem). Třetí tlačítko je pouze hardwarový reset, který resetuje celé Arduino a tím smaže i pozice z paměti. Program, který přikládám mi funguje bez problému, až na snížení rychlostí těchto serv. Vím, že je to potřeba řešit přes funkci millis(), ale nevím jak to do programu implementovat, vyzkoušel jsem už tolik možností, ale vždy se v něčem objevil problém, na internetu jsem našel články jak pro blikání led bez delay, tak i dokonce pro sweep servo bez delay (bez driveru PCA9685), problém je že používám driver PCA9685 a ještě k tomu ukládám spoustu hodnot z potenciometru do proměnných (hodnota je někdy větší, někdy menší, nejedná se o hodnoty pouze rostoucí nebo klesající. Budu nesmírně rád a vděčný za jakýkoliv nápad nebo radu.
Kód: Vybrat vše
#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>
Adafruit_PWMServoDriver driverPCA = Adafruit_PWMServoDriver(0x40);
#define pot1 A0
#define pot2 A1
#define pot3 A2
#define pot4 A3
#define pot5 A6
#define pot6 A7
#define tl1 11
#define tl2 12
const int POCET=20;
int posledniPoloha, i=0;
int m1[POCET], m2[POCET], m3[POCET], m4[POCET], m5[POCET], m6[POCET];
int pos1, pos2, pos3, pos4, pos5, pos6;
void setup() {
driverPCA.begin();
driverPCA.setPWMFreq(60);
pinMode(tl1,INPUT);
pinMode(tl2,INPUT);
}
void loop() {
if(digitalRead(tl1)==HIGH){
m1[i]=pos1;
m2[i]=pos2;
m3[i]=pos3;
m4[i]=pos4;
m5[i]=pos5;
m6[i]=pos6;
i++;
delay(500);
}
if(digitalRead(tl2)==HIGH){
i=0;
while(i<posledniPoloha){
autoServo1();
autoServo2();
autoServo3();
autoServo4();
autoServo5();
autoServo6();
i++;
delay(500);
}
}
else
{
manualServo1();
manualServo2();
manualServo3();
manualServo4();
manualServo5();
manualServo6();
posledniPoloha=i;
}
}
void manualServo1(){
pos1 = analogRead(pot1);
int pulse1 = map(pos1, 0, 1023, 100, 600);
driverPCA.setPWM(0, 0, pulse1);
}
void manualServo2(){
pos2 = analogRead(pot2);
int pulse2 = map(pos2, 0, 1023, 100, 600);
driverPCA.setPWM(1, 0, pulse2);
}
void manualServo3(){
pos3 = analogRead(pot3);
int pulse3 = map(pos3, 0, 1023, 100, 600);
driverPCA.setPWM(2, 0, pulse3);
}
void manualServo4(){
pos4 = analogRead(pot4);
int pulse4 = map(pos4, 0, 1023, 100, 600);
driverPCA.setPWM(3, 0, pulse4);
}
void manualServo5(){
pos5 = analogRead(pot5);
int pulse5 = map(pos5, 0, 1023, 100, 600);
driverPCA.setPWM(4, 0, pulse5);
}
void manualServo6(){
pos6 = analogRead(pot6);
int pulse6 = map(pos6, 0, 1023, 100, 600);
driverPCA.setPWM(5, 0, pulse6);
}
void autoServo1(){
int pulse1 = map(m1[i], 0, 1023, 100, 600);
driverPCA.setPWM(0, 0, pulse1);
}
void autoServo2(){
int pulse2 = map(m2[i], 0, 1023, 100, 600);
driverPCA.setPWM(1, 0, pulse2);
}
void autoServo3(){
int pulse3 = map(m3[i], 0, 1023, 100, 600);
driverPCA.setPWM(2, 0, pulse3);
}
void autoServo4(){
int pulse4 = map(m4[i], 0, 1023, 100, 600);
driverPCA.setPWM(3, 0, pulse4);
}
void autoServo5(){
int pulse5 = map(m5[i], 0, 1023, 100, 600);
driverPCA.setPWM(4, 0, pulse5);
}
void autoServo6(){
int pulse6 = map(m6[i], 0, 1023, 100, 600);
driverPCA.setPWM(5, 0, pulse6);
}