Ви не увійшли.
Сторінки 1
Я рад за Ваших детей и Вам мое уважение за такой подход. Только моему сыну всего 3 года, он ещё не разговаривает толком и хочет он машинку, а не дуинку. С операторами по ходу разбираюсь Чужие программы в слепую не копирую, - стараюсь понять принцип, а потом адаптировать для своей задачи.
Сейчас получил из поднебесной дисплей 16*2 постараюсь посмотреть, что приходит с андроида по зубу в дуинку, потом буду двигаться дальше.
За видео курс спасибо - полезный ресурс. Буду изучать.
И все это я прекрасно понимаю, но ((( сколько же вас грамотных и все, наверное самоучки, и учитель у всех - интернет... а я сижу, ничего не делаю, в интернет лезть не хочу... Но с репликами, подобной Вашей, в интернете подсказок больше не становится. А я сажусь заливать в машинку свои куралесы, малый приходит "Дай!" Минут 20 я отговариваюсь, а потом тесты заканчиваются. А принимая во внимание детскую любознательность, в препарированную ребёнком при моём недосмотре машинку заливать что-то будет бессмысленно. )))
Потому и прошу подсказать, куда двигаться.
И еще: есть ли возможность и как, подключив дуину к компу увидеть, какие сигналы приходят (и приходят ли) на неё по зубу? Может не в скетче дело, а в андроиде? (хотя в это я почти не верю).
Убрал указанное нафиг... результат нулевой. сигнал на моторы не приходит. Хоть бы что "зашуршало, цокнуло"...
Насчет
analogWrite(PIN_MOTOR_............._SPEED, v); - не уверен, а
digitalWrite(PIN_MOTOR_..............., LOW); - по моему, точно не мешает.
Если Вы о случае:
case 'S':
digitalWrite(PIN_MOTOR_STEERING_UP, LOW);
digitalWrite(PIN_MOTOR_STEERING_DN, LOW);
analogWrite(PIN_MOTOR_STEERING_SPEED, v);
digitalWrite(PIN_MOTOR_RUNNING_UP, LOW);
digitalWrite(PIN_MOTOR_RUNNING_DN, LOW);
analogWrite(PIN_MOTOR_RUNNING_SPEED, v);
break;
- то останавливать машину надо как-то...
если о самой верхней или нижней секции лупа - убрал - без результата.
Прошу прощения - исправил.
Собрал машинку с начинкой Ардуино ПРО МИНИ + плата блютуза HC-06 + плата драйвера L298N + 2 DC мотора
Как и положено в таких случаях - в интернете куча разного... с использованием двухколесных китов, есть так же варианты мотор+серво, но вариантов на 2 мотора я не нашел.
Переработал код с сайта RemoteXY - получилось вот такое:
/////////////////////////////////////////////
// RemoteXY include library //
/////////////////////////////////////////////
/* RemoteXY select connection mode and include library */
#define REMOTEXY_MODE__SOFTWARESERIAL
#include <SoftwareSerial.h>
#include <RemoteXY.h>
/* RemoteXY connection settings */
#define REMOTEXY_SERIAL_RX 2
#define REMOTEXY_SERIAL_TX 3
#define REMOTEXY_SERIAL_SPEED 9600
/* RemoteXY configurate */
unsigned char RemoteXY_CONF[] =
{ 3,0,23,0,1,5,5,15,41,11
,43,43,1,2,0,6,5,27,11,5
,79,78,0,79,70,70,0 };
/* this structure defines all the variables of your control interface */
struct {
/* input variable */
signed char joystick_1_x; /* =-100..100 x-coordinate joystick position */
signed char joystick_1_y; /* =-100..100 y-coordinate joystick position */
unsigned char switch_1; /* =1 if switch ON and =0 if OFF */
/* other variable */
unsigned char connect_flag; /* =1 if wire connected, else =0 */
} RemoteXY;
/////////////////////////////////////////////
// END RemoteXY include //
/////////////////////////////////////////////
/* defined the right motor control pins */
#define PIN_MOTOR_STEERING_UP 5
#define PIN_MOTOR_STEERING_DN 4
#define PIN_MOTOR_STEERING_SPEED 10
/* defined the left motor control pins */
#define PIN_MOTOR_RUNNING_UP 7
#define PIN_MOTOR_RUNNING_DN 6
#define PIN_MOTOR_RUNNING_SPEED 9
/* defined the LED pin */
#define PIN_LED 13
/* defined two arrays with a list of pins for each motor */
unsigned char SteeringMotor[3] =
{PIN_MOTOR_STEERING_UP, PIN_MOTOR_STEERING_DN, PIN_MOTOR_STEERING_SPEED};
unsigned char RunningMotor[3] =
{PIN_MOTOR_RUNNING_UP, PIN_MOTOR_RUNNING_DN, PIN_MOTOR_RUNNING_SPEED};
/*
speed control of the motor
motor - pointer to an array of pins
v - motor speed can be set from -100 to 100
*/
void setup() {
/* initialization pins */
pinMode (PIN_MOTOR_STEERING_UP, OUTPUT);
pinMode (PIN_MOTOR_STEERING_DN, OUTPUT);
pinMode (PIN_MOTOR_RUNNING_UP, OUTPUT);
pinMode (PIN_MOTOR_RUNNING_DN, OUTPUT);
pinMode (PIN_LED, OUTPUT);
/* initialization module RemoteXY */
RemoteXY_Init ();
}
void loop() {
RemoteXY_Handler ();
// analogRead RemoteXY.joystick_1_y;
// analogRead RemoteXY.joystick_1_x;
int vr = RemoteXY.joystick_1_x;
int vs = RemoteXY.joystick_1_y;
if (vr>0)
{
digitalWrite(RunningMotor[0], HIGH);
digitalWrite(RunningMotor[1], LOW);
analogWrite(RunningMotor[2], vr*2.55);
}
else if (vr<0)
{
digitalWrite(RunningMotor[0], LOW);
digitalWrite(RunningMotor[1], HIGH);
analogWrite(RunningMotor[2], (-vr)*2.55);
}
else
{
digitalWrite(RunningMotor[0], LOW);
digitalWrite(RunningMotor[1], LOW);
analogWrite(RunningMotor[2], 0);
}
if (vs>0) {
digitalWrite(SteeringMotor[0], HIGH);
digitalWrite(SteeringMotor[1], LOW);
analogWrite(SteeringMotor[2], vs*2.55);
}
else if (vs<0) {
digitalWrite(SteeringMotor[0], LOW);
digitalWrite(SteeringMotor[1], HIGH);
analogWrite(SteeringMotor[2], (-vs)*2.55);
}
else {
digitalWrite(SteeringMotor[0], LOW);
digitalWrite(SteeringMotor[1], LOW);
analogWrite(SteeringMotor[2], 0);
}
}
Результат положительный - машинка едет как положено. Но есть трабл. Бесплатная версия RemoteXY работает только 30 сек., а с финансами проблема. Стал искать другие варианты.
Нашел такое https://www.youtube.com/watch?v=46w362K6BDk
Показалось подходящим, но тут используется MotorShieldR3, а у меня его нет. Попробовал перелепить предложенный автором код под мою конфигурацию. Получилось такое:
/*
Front Motor (Steering) => Channel A
Back Motor => Channel B
Since the motor shield hijacks 6 pins for the motors'
control, they are declared in the MotorShieldR3 library.
*/
#include <SoftwareSerial.h>
int bluetoothTx = 2;
int bluetoothRx = 3;
SoftwareSerial bluetooth(bluetoothTx, bluetoothRx);
/* defined the right motor control pins */
#define PIN_MOTOR_STEERING_UP 7
#define PIN_MOTOR_STEERING_DN 6
#define PIN_MOTOR_STEERING_SPEED 10
/* defined the left motor control pins */
#define PIN_MOTOR_RUNNING_UP 4
#define PIN_MOTOR_RUNNING_DN 5
#define PIN_MOTOR_RUNNING_SPEED 9
/*
#include <MotorShieldR3.h>
MotorShieldR3 yellowCar;*/
#define pinfrontLights 13 //Pin that activates the Front lights.
#define pinbackLights 12 //Pin that activates the Back lights.
char command = 'S';
int v = 250;
int timer0 = millis();
int timer1 = 0;
void setup()
{
//Setup Bluetooth serial connection to android
Serial.begin(115200); //Set the baud rate to that of your Bluetooth module.
pinMode(pinfrontLights , OUTPUT);
pinMode(pinbackLights , OUTPUT);
pinMode (PIN_MOTOR_STEERING_UP, OUTPUT);
pinMode (PIN_MOTOR_STEERING_DN, OUTPUT);
pinMode (PIN_MOTOR_RUNNING_UP, OUTPUT);
pinMode (PIN_MOTOR_RUNNING_DN, OUTPUT);
}
void loop(){
digitalWrite(PIN_MOTOR_STEERING_UP, LOW);
digitalWrite(PIN_MOTOR_STEERING_DN, LOW);
analogWrite(PIN_MOTOR_STEERING_SPEED, v);
digitalWrite(PIN_MOTOR_RUNNING_UP, LOW);
digitalWrite(PIN_MOTOR_RUNNING_DN, LOW);
analogWrite(PIN_MOTOR_RUNNING_SPEED, v);
if(Serial.available() > 0){
command = Serial.read();
//Change pin mode only if new command is different from previous.
//Serial.println(command);
switch(command){
case 'F':
// yellowCar.Forward_4W(velocity);
digitalWrite(PIN_MOTOR_STEERING_UP, LOW);
digitalWrite(PIN_MOTOR_STEERING_DN, LOW);
analogWrite(PIN_MOTOR_STEERING_SPEED, v);
digitalWrite(PIN_MOTOR_RUNNING_UP, HIGH);
digitalWrite(PIN_MOTOR_RUNNING_DN, LOW);
analogWrite(PIN_MOTOR_RUNNING_SPEED, v);
break;
case 'B':
// yellowCar.Back_4W(velocity);
digitalWrite(PIN_MOTOR_STEERING_UP, LOW);
digitalWrite(PIN_MOTOR_STEERING_DN, LOW);
analogWrite(PIN_MOTOR_STEERING_SPEED, v);
digitalWrite(PIN_MOTOR_RUNNING_UP, LOW);
digitalWrite(PIN_MOTOR_RUNNING_DN, HIGH);
analogWrite(PIN_MOTOR_RUNNING_SPEED, v);
break;
case 'L':
// yellowCar.Left_4W();
digitalWrite(PIN_MOTOR_STEERING_UP, HIGH);
digitalWrite(PIN_MOTOR_STEERING_DN, LOW);
analogWrite(PIN_MOTOR_STEERING_SPEED, v);
digitalWrite(PIN_MOTOR_RUNNING_UP, LOW);
digitalWrite(PIN_MOTOR_RUNNING_DN, LOW);
analogWrite(PIN_MOTOR_RUNNING_SPEED, v);
break;
case 'R':
// yellowCar.Right_4W();
digitalWrite(PIN_MOTOR_STEERING_UP, LOW);
digitalWrite(PIN_MOTOR_STEERING_DN, HIGH);
analogWrite(PIN_MOTOR_STEERING_SPEED, v);
digitalWrite(PIN_MOTOR_RUNNING_UP, LOW);
digitalWrite(PIN_MOTOR_RUNNING_DN, LOW);
analogWrite(PIN_MOTOR_RUNNING_SPEED, v);
break;
case 'S':
// yellowCar.Stopped_4W();
digitalWrite(PIN_MOTOR_STEERING_UP, LOW);
digitalWrite(PIN_MOTOR_STEERING_DN, LOW);
analogWrite(PIN_MOTOR_STEERING_SPEED, v);
digitalWrite(PIN_MOTOR_RUNNING_UP, LOW);
digitalWrite(PIN_MOTOR_RUNNING_DN, LOW);
analogWrite(PIN_MOTOR_RUNNING_SPEED, v);
break;
case 'I': //FR
// yellowCar.ForwardRight_4W(velocity);
digitalWrite(PIN_MOTOR_STEERING_UP, LOW);
digitalWrite(PIN_MOTOR_STEERING_DN, HIGH);
analogWrite(PIN_MOTOR_STEERING_SPEED, v);
digitalWrite(PIN_MOTOR_RUNNING_UP, HIGH);
digitalWrite(PIN_MOTOR_RUNNING_DN, LOW);
analogWrite(PIN_MOTOR_RUNNING_SPEED, v);
break;
case 'J': //BR
// yellowCar.BackRight_4W(velocity);
digitalWrite(PIN_MOTOR_STEERING_UP, LOW);
digitalWrite(PIN_MOTOR_STEERING_DN, HIGH);
analogWrite(PIN_MOTOR_STEERING_SPEED, v);
digitalWrite(PIN_MOTOR_RUNNING_UP, LOW);
digitalWrite(PIN_MOTOR_RUNNING_DN, HIGH);
analogWrite(PIN_MOTOR_RUNNING_SPEED, v);
break;
case 'G': //FL
// yellowCar.ForwardLeft_4W(velocity);
digitalWrite(PIN_MOTOR_STEERING_UP, HIGH);
digitalWrite(PIN_MOTOR_STEERING_DN, LOW);
analogWrite(PIN_MOTOR_STEERING_SPEED, v);
digitalWrite(PIN_MOTOR_RUNNING_UP, HIGH);
digitalWrite(PIN_MOTOR_RUNNING_DN, LOW);
analogWrite(PIN_MOTOR_RUNNING_SPEED, v);
break;
case 'H': //BL
// yellowCar.BackLeft_4W(velocity);
digitalWrite(PIN_MOTOR_STEERING_UP, HIGH);
digitalWrite(PIN_MOTOR_STEERING_DN, LOW);
analogWrite(PIN_MOTOR_STEERING_SPEED, v);
digitalWrite(PIN_MOTOR_RUNNING_UP, LOW);
digitalWrite(PIN_MOTOR_RUNNING_DN, HIGH);
analogWrite(PIN_MOTOR_RUNNING_SPEED, v);
break;
case 'W': //Font ON
digitalWrite(pinfrontLights, HIGH);
break;
case 'w': //Font OFF
digitalWrite(pinfrontLights, LOW);
break;
case 'U': //Back ON
digitalWrite(pinbackLights, HIGH);
break;
case 'u': //Back OFF
digitalWrite(pinbackLights, LOW);
break;
case 'D': //Everything OFF
digitalWrite(pinfrontLights, LOW);
digitalWrite(pinbackLights, LOW);
// yellowCar.Stopped_4W();
digitalWrite(PIN_MOTOR_STEERING_UP, LOW);
digitalWrite(PIN_MOTOR_STEERING_DN, LOW);
analogWrite(PIN_MOTOR_STEERING_SPEED, v);
digitalWrite(PIN_MOTOR_RUNNING_UP, LOW);
digitalWrite(PIN_MOTOR_RUNNING_DN, LOW);
analogWrite(PIN_MOTOR_RUNNING_SPEED, v);
break;
default: //Get velocity
if(command=='q'){
v = 255; //Full velocity
// yellowCar.SetSpeed_4W(velocity);
}
else{
//Chars '0' - '9' have an integer equivalence of 48 - 57, accordingly.
if((command >= 48) && (command <= 57)){
//Subtracting 48 changes the range from 48-57 to 0-9.
//Multiplying by 25 changes the range from 0-9 to 0-225.
v = (command - 48)*25;
// yellowCar.SetSpeed_4W(velocity);
}
}
}
}
else
{
timer0 = millis(); //Get the current time (millis since execution started).
//Check if it has been 500ms since we received last command.
if((timer0 - timer1)>500){
//More tan 500ms have passed since last command received, car is out of range.
//Therefore stop the car and turn lights off.
digitalWrite(pinfrontLights, LOW);
digitalWrite(pinbackLights, LOW);
// yellowCar.Stopped_4W();
digitalWrite(PIN_MOTOR_STEERING_UP, LOW);
digitalWrite(PIN_MOTOR_STEERING_DN, LOW);
analogWrite(PIN_MOTOR_STEERING_SPEED, v);
digitalWrite(PIN_MOTOR_RUNNING_UP, LOW);
digitalWrite(PIN_MOTOR_RUNNING_DN, LOW);
analogWrite(PIN_MOTOR_RUNNING_SPEED, v);
}
}
}
Код компилируется, но моторы двигаться не хотят.
Пожалуйста, помогите найти и исправить ошибку. Или ссылку на рабочий код под мою конфигурацию, если находил кто. Только не отсылайте курить интернет - у меня за пол года от всего этого дыма голова раскалывается уже...
Ок. Механическая часть пока не готова, как работает сама электроника, "с руки" так сказать могу показать уже. Или Вам полностью готовый нужен?
Все оказалось намного проще. Там для этого предусмотрено
sensitivity = 10; // this controls the sensitivity of the tracker. lower number = higher sensitivity. if your tracker is constantly jittering back and forth increase the number
и дальше в скетче
if ... && (diff > sensitivity)...
Просто я был настолько занят глобальной переделкой, что обратил на это внимание только после тщательной проверкой всех строк.
В результате, после регулировок параметров есть скетч, который полностью удовлетворяет моим требованиям
Так что если кому-то нужен
Солнечный трекер на Ардуино ПРО МИНИ + 2 ULN2003A + 2 шаговика - вот он:
Детали:
Макетная плата - 1шт
Подставка под микросхему подходящая к ПРО МИНИ - 1 шт
Ардуино ПРО МИНИ - 1 шт
ULN2003A - 2 шт
шаговики - 2 шт
Резисторы 10 КОм - 5 шт
Фото резисторы - 3 шт
Проводки, гнезда, гнезда питания - по потребности
Скетч:
#define TILTL 2
#define TILTH 3
#define BOTTOM 2
#define TOPLEFT 0
#define TOPRIGHT 1
// #include <AccelStepper.h>
#include "math.h"
// Назначение пинов выводам для UNL 2003A 1 мотора
int motorPin1 = 6;
int motorPin2 = 7;
int motorPin3 = 8;
int motorPin4 = 9;
// Назначение пинов выводам для UNL 2003A 2 мотора
int motorPin5 = 10;
int motorPin6 = 11;
int motorPin7 = 12;
int motorPin8 = 13;
// Назначение пинов выводам кнопок (один вывод кнопок - соответственно, а второй - на GND)
int tlsense;
int trsense;
int bsense;
int tavg;
int diff;
int spd;
int divisor;
int sensitivity;
int tiltl;
int tilth;
// установить скорость шагового двигателя.
//variable to set stepper speed.
int motorSpeed = 14000;
int lookup_1[8] = {
B01000, B01100, B00100, B00110, B00010, B00011, B00001, B01001};
int lookup_2[8] = {
B01000, B01100, B00100, B00110, B00010, B00011, B00001, B01001};
/////////////////////////////////////////////////////////////////
void setup () {
divisor = 10; // this controls the speed of the servo. lower number = higher speed
sensitivity = 30; // this controls the sensitivity of the tracker. lower number = higher sensitivity. if your tracker is constantly jittering back and forth increase the number
Serial.begin(9600); // open serial com
Serial.print("SolarTracker ready!");
pinMode(BOTTOM, INPUT); // set the inputs
pinMode(TOPLEFT, INPUT);
pinMode(TOPRIGHT, INPUT);
pinMode(TILTL, INPUT);
pinMode(TILTH, INPUT);
pinMode(motorPin1, OUTPUT);
pinMode(motorPin2, OUTPUT);
pinMode(motorPin3, OUTPUT);
pinMode(motorPin4, OUTPUT);
pinMode(motorPin5, OUTPUT);
pinMode(motorPin6, OUTPUT);
pinMode(motorPin7, OUTPUT);
pinMode(motorPin8, OUTPUT);
//digitalWrite(TILTL, HIGH);
//digitalWrite(TILTH, HIGH);
}
///////////////////////////////////////////////////////
void loop () {
tiltl = digitalRead(TILTL); // read the tilt sensor
tilth = digitalRead(TILTH);
tlsense = analogRead(TOPLEFT); // read the light sensors
trsense = analogRead(TOPRIGHT);
bsense = analogRead(BOTTOM);
bsense = bsense * 1.05; // I had to adjust the value of this sensor to make it more accurate. you might have to do the same but start by leaving it alone
tavg = (tlsense + trsense)/2; // get an average value for the top 2 sensors
diff = abs(tavg - bsense); // this judges how far the tracker must turn
spd = diff/divisor; // and adjusts the speed of the reaction accordingly
spd = max(spd, 1); // sets the minimum speed to 1
Serial.print("\nTOP: "); Serial.print(tavg, DEC); // print the sensor values to the serial com
Serial.print("\tBOTTOM:"); Serial.print(bsense, DEC);
Serial.print("\tLEFT:"); Serial.print(tlsense, DEC);
Serial.print("\tRIGHT:"); Serial.print(trsense, DEC);
if((tavg < bsense) && (diff > sensitivity) && (tiltl == HIGH) && (tilth == HIGH)){ // if the average value of the top sensors is smaller (more light) than the bottom sensor and the tilt sensor is in the correct range
clockwise_1(); // Мотор 1 крутим вправо.
Serial.print("\tState: "); Serial.print("V_UP!");
}else if((tavg < bsense) && (diff > sensitivity) && (tiltl == HIGH) && (tilth == LOW)){ // if the average value of the top sensors is smaller (more light) than the bottom sensor and the tilt sensor is in the correct range
//clockwise_1(); // Мотор 1 крутим вправо.
digitalWrite(motorPin1, LOW); //останавливаем мотор
digitalWrite(motorPin2, LOW);
digitalWrite(motorPin3, LOW);
digitalWrite(motorPin4, LOW);
Serial.print("\tState: "); Serial.print("V_STOP!");
}else if((tavg > bsense) && (diff > sensitivity) && (tiltl == HIGH) && (tilth == HIGH)){ // if the value of the bottom sensor is smaller (more light) than the average value of the top sensors and the tilt sensor is in the correct range
anticlockwise_1(); // Мотор 1 крутим влево.
Serial.print("\tState: "); Serial.print("V_DOWN!");
}else if((tavg > bsense) && (diff > sensitivity) && (tiltl == LOW) && (tilth == HIGH)){ // if the value of the bottom sensor is smaller (more light) than the average value of the top sensors and the tilt sensor is in the correct range
//anticlockwise_1(); // Мотор 1 крутим влево.
digitalWrite(motorPin1, LOW); //останавливаем мотор
digitalWrite(motorPin2, LOW);
digitalWrite(motorPin3, LOW);
digitalWrite(motorPin4, LOW);
Serial.print("\tState: "); Serial.print("V_STOP!");
}else{ // for every other instance
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, LOW);
digitalWrite(motorPin3, LOW);
digitalWrite(motorPin4, LOW);
//clockwise_1(); // Мотор 1 крутим вправо.
// digitalWrite(motorPin1, LOW);
// digitalWrite(motorPin2, LOW);
// digitalWrite(motorPin3, LOW);
// digitalWrite(motorPin4, LOW);
//Serial.print("\tState: "); Serial.print("STOP!");
}
tlsense = analogRead(TOPLEFT); // read the top 2 sensors again because they have probably changed
trsense = analogRead(TOPRIGHT);
trsense = trsense * 1.03; // again I had to adjust the value of one sensor to make the tracker more accurate
diff = abs(tlsense - trsense); // reset the diff variable for the new values
spd = diff/divisor; // and generate a speed accordingly
spd = max(spd, 1); // set the minimum speed to 1
if((tlsense < trsense) && (diff > sensitivity)){ // if the top left sensor value is smaller (more light) than the top right sensor
clockwise_2(); // Мотор 2 крутим вправо.
Serial.print("\tState: "); Serial.print("H_RIGHT!");
}else if((tlsense > trsense) && (diff > sensitivity)){ // if the top left sensor value is larger (less light) than the top right sensor
anticlockwise_2(); // Мотор 2 крутим влево.
Serial.print("\tState: "); Serial.print("H_LEFT!");
}else{ // for every other instance
digitalWrite(motorPin5, LOW);
digitalWrite(motorPin6, LOW);
digitalWrite(motorPin7, LOW);
digitalWrite(motorPin8, LOW);
Serial.print("\tState: "); Serial.print("H_STOP!");
}
delay(10); // delay 10ms
}
// //////////////////////////////////////////////////////////////
// функция поворачивает мотор 1 против часовой стрелки.
void anticlockwise_1()
{
for(int i = 0; i < 8; i++)
{
setOutput_1(i);
delayMicroseconds(motorSpeed);
}
}
// функция поворачивает мотор 1 по часовой стрелке.
void clockwise_1()
{
for(int i = 7; i >= 0; i--)
{
setOutput_1(i);
delayMicroseconds(motorSpeed);
}
}
// функция поворачивает мотор 2 против часовой стрелки.
void anticlockwise_2()
{
for(int j = 0; j < 8; j++)
{
setOutput_2(j);
delayMicroseconds(motorSpeed);
}
}
// функция поворачивает мотор 2 по часовой стрелке.
void clockwise_2()
{
for(int j = 7; j >= 0; j--)
{
setOutput_2(j);
delayMicroseconds(motorSpeed);
}
}
/////////////////////////////////////////////////////////////
void setOutput_1(int out)
{
digitalWrite(motorPin1, bitRead(lookup_1[out], 0));
digitalWrite(motorPin2, bitRead(lookup_1[out], 1));
digitalWrite(motorPin3, bitRead(lookup_1[out], 2));
digitalWrite(motorPin4, bitRead(lookup_1[out], 3));
}
void setOutput_2(int out)
{
digitalWrite(motorPin5, bitRead(lookup_2[out], 0));
digitalWrite(motorPin6, bitRead(lookup_2[out], 1));
digitalWrite(motorPin7, bitRead(lookup_2[out], 2));
digitalWrite(motorPin8, bitRead(lookup_2[out], 3));
}
Успехов!
Спасибо, нашел.
Ну что ж, склеил части двух скетчей и получил следующее:
Двуосевой трекер для солнечной батареи на шаговых двигателях.
Ардуино ПРО МИНИ + 2 ULN2003A + 2 28BYJ-48-5V
#define TILTL 2
#define TILTH 3
#define BOTTOM 2
#define TOPLEFT 0
#define TOPRIGHT 1
// #include <AccelStepper.h>
#include "math.h"
// Назначение пинов выводам для UNL 2003A 1 мотора
int motorPin1 = 6;
int motorPin2 = 7;
int motorPin3 = 8;
int motorPin4 = 9;
// Назначение пинов выводам для UNL 2003A 2 мотора
int motorPin5 = 10;
int motorPin6 = 11;
int motorPin7 = 12;
int motorPin8 = 13;
// Назначение пинов выводам кнопок (один вывод кнопок - соответственно, а второй - на GND)
int tlsense;
int trsense;
int bsense;
int tavg;
int diff;
int spd;
int divisor;
int sensitivity;
int tiltl;
int tilth;
// фиксируем нажатие на первую и вторую кнопку соответственно.
boolean q;
boolean w;
// установить скорость шагового двигателя.
//variable to set stepper speed.
int motorSpeed = 14000;
int lookup_1[8] = {
B01000, B01100, B00100, B00110, B00010, B00011, B00001, B01001};
int lookup_2[8] = {
B01000, B01100, B00100, B00110, B00010, B00011, B00001, B01001};
/////////////////////////////////////////////////////////////////
void setup () {
// divisor = 10; // this controls the speed of the servo. lower number = higher speed
sensitivity = 10; // this controls the sensitivity of the tracker. lower number = higher sensitivity. if your tracker is constantly jittering back and forth increase the number
Serial.begin(19200); // open serial com
Serial.print("SolarTracker ready!");
pinMode(BOTTOM, INPUT); // set the inputs
pinMode(TOPLEFT, INPUT);
pinMode(TOPRIGHT, INPUT);
pinMode(TILTL, INPUT);
pinMode(TILTH, INPUT);
pinMode(motorPin1, OUTPUT);
pinMode(motorPin2, OUTPUT);
pinMode(motorPin3, OUTPUT);
pinMode(motorPin4, OUTPUT);
pinMode(motorPin5, OUTPUT);
pinMode(motorPin6, OUTPUT);
pinMode(motorPin7, OUTPUT);
pinMode(motorPin8, OUTPUT);
digitalWrite(TILTL, HIGH);
digitalWrite(TILTH, HIGH);
}
///////////////////////////////////////////////////////
void loop () {
tiltl = digitalRead(TILTL); // read the tilt sensor
tilth = digitalRead(TILTH);
tlsense = analogRead(TOPLEFT); // read the light sensors
trsense = analogRead(TOPRIGHT);
bsense = analogRead(BOTTOM);
bsense = bsense * 1.05; // I had to adjust the value of this sensor to make it more accurate. you might have to do the same but start by leaving it alone
tavg = (tlsense + trsense)/2; // get an average value for the top 2 sensors
diff = abs(tavg - bsense); // this judges how far the tracker must turn
spd = diff/divisor; // and adjusts the speed of the reaction accordingly
spd = max(spd, 1); // sets the minimum speed to 1
//Serial.print("\nTOP: "); Serial.print(tavg, DEC); // print the sensor values to the serial com
//Serial.print("\tBOTTOM:"); Serial.print(bsense, DEC);
//Serial.print("\tLEFT:"); Serial.print(tlsense, DEC);
//Serial.print("\tRIGHT:"); Serial.print(trsense, DEC);
if((tavg < bsense) && (diff > sensitivity) && (tiltl == HIGH) && (tilth == HIGH)){ // if the average value of the top sensors is smaller (more light) than the bottom sensor and the tilt sensor is in the correct range
clockwise_1(); // Мотор 1 крутим вправо.
//Serial.print("\tState: "); Serial.print("UP!");
}else if((tavg < bsense) && (diff > sensitivity) && (tiltl == LOW) && (tilth == HIGH)){ // if the average value of the top sensors is smaller (more light) than the bottom sensor and the tilt sensor is in the correct range
clockwise_1(); // Мотор 1 крутим вправо.
// Serial.print("\tState: "); Serial.print("UP!");
}else if((tavg > bsense) && (diff > sensitivity) && (tiltl == HIGH) && (tilth == HIGH)){ // if the value of the bottom sensor is smaller (more light) than the average value of the top sensors and the tilt sensor is in the correct range
anticlockwise_1(); // Мотор 1 крутим влево.
//Serial.print("\tState: "); Serial.print("DOWN!");
}else if((tavg > bsense) && (diff > sensitivity) && (tiltl == HIGH) && (tilth == LOW)){ // if the value of the bottom sensor is smaller (more light) than the average value of the top sensors and the tilt sensor is in the correct range
anticlockwise_1(); // Мотор 1 крутим влево.
//Serial.print("\tState: "); Serial.print("DOWN!");
}else{ // for every other instance
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, LOW);
digitalWrite(motorPin3, LOW);
digitalWrite(motorPin4, LOW);
clockwise_1(); // Мотор 1 крутим вправо.
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, LOW);
digitalWrite(motorPin3, LOW);
digitalWrite(motorPin4, LOW);
//Serial.print("\tState: "); Serial.print("STOP!");
}
tlsense = analogRead(TOPLEFT); // read the top 2 sensors again because they have probably changed
trsense = analogRead(TOPRIGHT);
trsense = trsense * 1.03; // again I had to adjust the value of one sensor to make the tracker more accurate
diff = abs(tlsense - trsense); // reset the diff variable for the new values
spd = diff/divisor; // and generate a speed accordingly
spd = max(spd, 1); // set the minimum speed to 1
if((tlsense < trsense) && (diff > sensitivity)){ // if the top left sensor value is smaller (more light) than the top right sensor
clockwise_2(); // Мотор 2 крутим вправо.
//Serial.print("\tState: "); Serial.print("LEFT!");
}else if((tlsense > trsense) && (diff > sensitivity)){ // if the top left sensor value is larger (less light) than the top right sensor
anticlockwise_2(); // Мотор 2 крутим влево.
//Serial.print("\tState: "); Serial.print("RIGHT!");
}else{ // for every other instance
digitalWrite(motorPin5, LOW);
digitalWrite(motorPin6, LOW);
digitalWrite(motorPin7, LOW);
digitalWrite(motorPin8, LOW);
//Serial.print("\tState: "); Serial.print("STOP!");
}
delay(10); // delay 10ms
}
// //////////////////////////////////////////////////////////////
// функция поворачивает мотор 1 против часовой стрелки.
void anticlockwise_1()
{
for(int i = 0; i < 8; i++)
{
setOutput_1(i);
delayMicroseconds(motorSpeed);
}
}
// функция поворачивает мотор 1 по часовой стрелке.
void clockwise_1()
{
for(int i = 7; i >= 0; i--)
{
setOutput_1(i);
delayMicroseconds(motorSpeed);
}
}
// функция поворачивает мотор 2 против часовой стрелки.
void anticlockwise_2()
{
for(int j = 0; j < 8; j++)
{
setOutput_2(j);
delayMicroseconds(motorSpeed);
}
}
// функция поворачивает мотор 2 по часовой стрелке.
void clockwise_2()
{
for(int j = 7; j >= 0; j--)
{
setOutput_2(j);
delayMicroseconds(motorSpeed);
}
}
/////////////////////////////////////////////////////////////
void setOutput_1(int out)
{
digitalWrite(motorPin1, bitRead(lookup_1[out], 0));
digitalWrite(motorPin2, bitRead(lookup_1[out], 1));
digitalWrite(motorPin3, bitRead(lookup_1[out], 2));
digitalWrite(motorPin4, bitRead(lookup_1[out], 3));
}
void setOutput_2(int out)
{
digitalWrite(motorPin5, bitRead(lookup_2[out], 0));
digitalWrite(motorPin6, bitRead(lookup_2[out], 1));
digitalWrite(motorPin7, bitRead(lookup_2[out], 2));
digitalWrite(motorPin8, bitRead(lookup_2[out], 3));
}
void setStop_1(int out)
{
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, LOW);
digitalWrite(motorPin3, LOW);
digitalWrite(motorPin4, LOW);
}
void setStop_2(int out)
{
digitalWrite(motorPin5, LOW);
digitalWrite(motorPin6, LOW);
digitalWrite(motorPin7, LOW);
digitalWrite(motorPin8, LOW);
}
Мне посоветовали сделать его на библиотеке Accelstepper, но я в ней только запутался - с Ардуино столкнулся впервые и то именно по причине монтажа солар трекера. - и потому сделал, как смог.
Скетч скомпилился и в дуинке успешно заработал.
Но хотелось бы увеличить "слепую" зону, чтоб трекер не дергался туда-сюда при малейшем изменении освещености.
Поможете?
Нашел способ заставить моторы крутиться только в случае нажатой кнопки. Но почему-то работает только с первой кнопкой. Когда аналогично прописываю вторую кнопку - пишет: collect2.exe: error: ld returned 5 exit status.
/* Исходный скетчДмитрий Осипов. http://www.youtube.com/user/d36073?feature=watch
v.01 button resistor Arduino Шаговый двигатель 28BYJ-48 – 5V Stepper Motor
----------------------------------------
Скачать sketch.
v.01 вправо влево Arduino Шаговый двигатель 28BYJ-48 – 5V Stepper Motor
https://yadi.sk/d/9trcfiK7ULkQS
v.01 button resistor Arduino Шаговый двигатель 28BYJ-48 – 5V Stepper Motor
*/
///////////////////////////////////////////////////////////////
// Назначение пинов выводам для UNL 2003A 1 мотора
int motorPin1 = 6;
int motorPin2 = 7;
int motorPin3 = 8;
int motorPin4 = 9;
// Назначение пинов выводам для UNL 2003A 2 мотора
int motorPin5 = 10;
int motorPin6 = 11;
int motorPin7 = 12;
int motorPin8 = 13;
// Назначение пинов выводам кнопок (один вывод кнопок - соответственно, а второй - на GND)
int buttonPin_1 = 2;
int buttonPin_2 = 3;
// фиксируем нажатие на первую и вторую кнопку соответственно.
boolean q;
boolean w;
// установить скорость шагового двигателя.
//variable to set stepper speed.
int motorSpeed = 14000;
int lookup_1[8] = {
B01000, B01100, B00100, B00110, B00010, B00011, B00001, B01001};
int lookup_2[8] = {
B01000, B01100, B00100, B00110, B00010, B00011, B00001, B01001};
/////////////////////////////////////////////////////////////////
void setup() {
// Заявляем пины моторов как выходные
pinMode(motorPin1, OUTPUT);
pinMode(motorPin2, OUTPUT);
pinMode(motorPin3, OUTPUT);
pinMode(motorPin4, OUTPUT);
pinMode(motorPin5, OUTPUT);
pinMode(motorPin6, OUTPUT);
pinMode(motorPin7, OUTPUT);
pinMode(motorPin8, OUTPUT);
// Заявляем пины кнопок как входные
pinMode(buttonPin_1, INPUT);
pinMode(buttonPin_2, INPUT);
//Устанавливаем высокий сигнал на пинах отжатых кнопок
digitalWrite(buttonPin_1, HIGH);
digitalWrite(buttonPin_2, HIGH);
// Serial.begin(9600);
}
////////////////////////////////////////////////////////////////
void loop(){
if (digitalRead(buttonPin_1) == LOW) // если кнопка 1 нажата.
{
q = !q; // меняем значение q на противоположное 0 на 1 или 1 на 0.
delay(500); // защита от дребезга кнопки.
}
if (digitalRead(buttonPin_1) == LOW) {// если кнопка 1 нажата.
if (q == 1){
while (digitalRead(buttonPin_1) == LOW){
anticlockwise_1(); // Мотор 1 крутим влево.
}
} else {
while (digitalRead(buttonPin_1) == LOW){
clockwise_1(); // Мотор 1 крутим вправо.
}
}
} else {
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, LOW);
digitalWrite(motorPin3, LOW);
digitalWrite(motorPin4, LOW);
}
/////////////////////////////
if (digitalRead(buttonPin_2) == LOW) // если кнопка 2 нажата.
{
w = !w; // меняем значение q на противоположное 0 на 1 или 1 на 0.
delay(500); // защита от дребезга кнопки.
}
// эти две строки - работают, но постоянно с перерывом на время работы мотора_1
if (w == 1) anticlockwise_2(); // Мотор_2 крутим влево.
else clockwise_2(); // Мотор_2 крутим вправо.
}
/* // А вот с этим фрагментом вместо предыдущих двух строчек почему-то не работает пишет collect2.exe: error: ld returned 5 exit status.
if (w == 1){
while (digitalRead(buttonPin_2) == LOW){
anticlockwise_2(); // Мотор 2 крутим влево.
}
} else {
while (digitalRead(buttonPin_2) == LOW){
clockwise_2(); // Мотор 2 крутим вправо.
}
}
} else {
digitalWrite(motorPin5, LOW);
digitalWrite(motorPin6, LOW);
digitalWrite(motorPin7, LOW);
digitalWrite(motorPin8, LOW);
}
*/
// //////////////////////////////////////////////////////////////
// функция поворачивает мотор 1 против часовой стрелки.
void anticlockwise_1()
{
for(int i = 0; i < 8; i++)
{
setOutput_1(i);
delayMicroseconds(motorSpeed);
}
}
// функция поворачивает мотор 1 по часовой стрелке.
void clockwise_1()
{
for(int i = 7; i >= 0; i--)
{
setOutput_1(i);
delayMicroseconds(motorSpeed);
}
}
// функция поворачивает мотор 2 против часовой стрелки.
void anticlockwise_2()
{
for(int j = 0; j < 8; j++)
{
setOutput_2(j);
delayMicroseconds(motorSpeed);
}
}
// функция поворачивает мотор 2 по часовой стрелке.
void clockwise_2()
{
for(int j = 7; j >= 0; j--)
{
setOutput_2(j);
delayMicroseconds(motorSpeed);
}
}
/////////////////////////////////////////////////////////////
void setOutput_1(int out)
{
digitalWrite(motorPin1, bitRead(lookup_1[out], 0));
digitalWrite(motorPin2, bitRead(lookup_1[out], 1));
digitalWrite(motorPin3, bitRead(lookup_1[out], 2));
digitalWrite(motorPin4, bitRead(lookup_1[out], 3));
}
void setOutput_2(int out)
{
digitalWrite(motorPin5, bitRead(lookup_2[out], 0));
digitalWrite(motorPin6, bitRead(lookup_2[out], 1));
digitalWrite(motorPin7, bitRead(lookup_2[out], 2));
digitalWrite(motorPin8, bitRead(lookup_2[out], 3));
}
void setStop_1(int out)
{
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, LOW);
digitalWrite(motorPin3, LOW);
digitalWrite(motorPin4, LOW);
}
void setStop_2(int out)
{
digitalWrite(motorPin5, LOW);
digitalWrite(motorPin6, LOW);
digitalWrite(motorPin7, LOW);
digitalWrite(motorPin8, LOW);
}
Все проверил - вроде все правильно. Убираю "while (digitalRead(buttonPin_1) == LOW)" - ошибки нет, но мотор_2 продолжает крутиться при разомкнутой кнопке.
Мне же нужно чтоб кнопка_2 работала точно так же, как кнопка_1 и при замыкании двух кнопок оба мотора работали одновременно и независимо.
Помогите, пожалуйста.
Собираю самонаводящийся солар трекер. после ДОЛГОГО И УПОРНОГО серфинга в нете нарыл проэкт мистера Адама http://www.instructables.com/id/Arduino … /?ALLSTEPS, но в нем используются отсутствующие у меня (по причине зашитых карманов) 360-градусные серво. Решил переделать его под 2 ULN2003A + 2 28BYJ-48-5V (по цене 2+2 дешевле чем 1 серво-360). Статей о подключении такой схемы не нашел. Решил попробовать запустить сперва схему без фотосенсора. Нашел в нете понятный мне скетч и, поколдовав, получил это:
-----------------------------------------------------------------------------------
/* Исходный скетч:
Дмитрий Осипов. [url]http://www.youtube.com/user/d36073?feature=watch[/url]
v.01 button resistor Arduino Шаговый двигатель 28BYJ-48 – 5V Stepper Motor
Скачать sketch.
v.01 вправо влево Arduino Шаговый двигатель 28BYJ-48 – 5V Stepper Motor
[url]https://yadi.sk/d/9trcfiK7ULkQS[/url]
v.01 button resistor Arduino Шаговый двигатель 28BYJ-48 – 5V Stepper Motor
*/
///////////////////////////////////////////////////////////////
// Назначение пинов выводам для UNL 2003A 1 мотора
int motorPin1 = 6;
int motorPin2 = 7;
int motorPin3 = 8;
int motorPin4 = 9;
// Назначение пинов выводам для UNL 2003A 2 мотора
int motorPin5 = 10;
int motorPin6 = 11;
int motorPin7 = 12;
int motorPin8 = 13;
// Назначение пинов выводам кнопок (один вывод кнопок - соответственно, а второй - на GND)
int buttonPin_1 = 2;
int buttonPin_2 = 3;
// фиксируем нажатие на первую и вторую кнопку соответственно.
boolean q;
boolean w;
// установить скорость шагового двигателя.
//variable to set stepper speed.
int motorSpeed = 14000;
int lookup_1[8] = {
B01000, B01100, B00100, B00110, B00010, B00011, B00001, B01001};
int lookup_2[8] = {
B01000, B01100, B00100, B00110, B00010, B00011, B00001, B01001};
/////////////////////////////////////////////////////////////////
void setup() {
// Заявляем пины моторов как выходные
pinMode(motorPin1, OUTPUT);
pinMode(motorPin2, OUTPUT);
pinMode(motorPin3, OUTPUT);
pinMode(motorPin4, OUTPUT);
pinMode(motorPin5, OUTPUT);
pinMode(motorPin6, OUTPUT);
pinMode(motorPin7, OUTPUT);
pinMode(motorPin8, OUTPUT);
// Заявляем пины кнопок как входные
pinMode(buttonPin_1, INPUT);
pinMode(buttonPin_2, INPUT);
//Устанавливаем высокий сигнал на пинах отжатых кнопок
digitalWrite(buttonPin_1, HIGH);
digitalWrite(buttonPin_2, HIGH);
// Serial.begin(9600);
}
////////////////////////////////////////////////////////////////
void loop(){
if (digitalRead(buttonPin_1) == LOW) // если кнопка 1 нажата.
{
q = !q; // меняем значение q на противоположное 0 на 1 или 1 на 0.
delay(500); // защита от дребезга кнопки.
}
if (q == 1)anticlockwise_1(); // Мотор 1 крутим влево.
else clockwise_1(); // Мотор 1 крутим вправо.
if (digitalRead(buttonPin_2) == LOW) // если кнопка 2 нажата.
{
w = !w; // меняем значение q на противоположное 0 на 1 или 1 на 0.
delay(500); // защита от дребезга кнопки.
}
if (w == 1)anticlockwise_2(); // Мотор 2 крутим влево.
else clockwise_2(); // Мотор 2 крутим вправо.
}
// //////////////////////////////////////////////////////////////
// функция поворачивает мотор 1 против часовой стрелки.
void anticlockwise_1()
{
for(int i = 0; i < 8; i++)
{
setOutput_1(i);
delayMicroseconds(motorSpeed);
}
}
// функция поворачивает мотор 1 по часовой стрелке.
void clockwise_1()
{
for(int i = 7; i >= 0; i--)
{
setOutput_1(i);
delayMicroseconds(motorSpeed);
}
}
// функция поворачивает мотор 2 против часовой стрелки.
void anticlockwise_2()
{
for(int j = 0; j < 8; j++)
{
setOutput_2(j);
delayMicroseconds(motorSpeed);
}
}
// функция поворачивает мотор 2 по часовой стрелке.
void clockwise_2()
{
for(int j = 7; j >= 0; j--)
{
setOutput_2(j);
delayMicroseconds(motorSpeed);
}
}
/////////////////////////////////////////////////////////////
void setOutput_1(int out)
{
digitalWrite(motorPin1, bitRead(lookup_1[out], 0));
digitalWrite(motorPin2, bitRead(lookup_1[out], 1));
digitalWrite(motorPin3, bitRead(lookup_1[out], 2));
digitalWrite(motorPin4, bitRead(lookup_1[out], 3));
}
void setOutput_2(int out)
{
digitalWrite(motorPin5, bitRead(lookup_2[out], 0));
digitalWrite(motorPin6, bitRead(lookup_2[out], 1));
digitalWrite(motorPin7, bitRead(lookup_2[out], 2));
digitalWrite(motorPin8, bitRead(lookup_2[out], 3));
}
--------------------------------------------------------------------
Заработало. Направление кнопками меняется успешно.
Но:
1. шаговики ступают по очереди
Вопрос: как сделать, чтоб они крутились независимо?
2. При нажатии на одну кнопку останавливаются оба двигателя, а потом на соответствующем меняется направление.
Вопрос: как сделать, чтоб при нажатии на одну кнопку останавливался только один мотор, который должен менять направление?
Если заинтересует - могу залить видео работы сборки.
Спасибо, исправил - все в норме.
Минька - после многодневного лазания по сайтам заметил, что так некоторые ардуинеры называют ПРО МИНИ.
Имею Arduino pro mini + 2 китайских готовых ULN2003A в перспективе нацепить два 28BYJ-48-5V для создания переносного солнечного трекера
На данный момент движков нет. Спаял все на монтажке, миньку, чтоб съемная была, нацепил на подставку под биос со старого принтера - подошло, проверил, залил пробный скетч
int motorPin1 = 13;
int motorPin2 = 12;
int motorPin3 = 11;
int motorPin4 = 10;
int motorPin5 = 9;
int motorPin6 = 8;
int motorPin7 = 7;
int motorPin8 = 6;
int motorSpeed = 10000;
int lookup[8] = {B01000, B01100, B00100, B00110, B00010, B00011, B00001, B01001};
//int lookup[8] = {B01000, B00100, B00010, B00001};
void setup()
{
pinMode(motorPin1, OUTPUT);
pinMode(motorPin2, OUTPUT);
pinMode(motorPin3, OUTPUT);
pinMode(motorPin4, OUTPUT);
pinMode(motorPin5, OUTPUT);
pinMode(motorPin6, OUTPUT);
pinMode(motorPin7, OUTPUT);
pinMode(motorPin8, OUTPUT);
}
void loop()
{
for(int i = 0; i < 8; i++)
{
setOutput(i);
delayMicroseconds(motorSpeed);
}
}
void setOutput(int out)
{
digitalWrite(motorPin1, bitRead(lookup[out], 3));
digitalWrite(motorPin2, bitRead(lookup[out], 2));
digitalWrite(motorPin3, bitRead(lookup[out], 1));
digitalWrite(motorPin4, bitRead(lookup[out], 0));
digitalWrite(motorPin5, bitRead(lookup[out], 0));
digitalWrite(motorPin6, bitRead(lookup[out], 1));
digitalWrite(motorPin7, bitRead(lookup[out], 2));
digitalWrite(motorPin8, bitRead(lookup[out], 3));
}
Сигнал пошел на оба драйвера, но четкого перемещения сигнала на светодиодах драйвера не наблюдается - все сливается в мерцание. При касании к кварцу скорость замедляется и четко прослеживается движение сигнала по светодиодам.
Так и должно быть? или тут какая то лажа с минькой?
Сторінки 1