Відповісти

Введіть повідомлення і натисніть Надіслати
Параметри

Назад

Огляд теми (нові повідомленні вгорі)

NoName
2016-02-09 11:52:44

https://www.arduino.cc/en/Tutorial/Knob

/*
Controlling a servo position using a potentiometer (variable resistor)
by Michal Rinott <http://people.interaction-ivrea.it/m.rinott>

modified on 8 Nov 2013
by Scott Fitzgerald
http://www.arduino.cc/en/Tutorial/Knob
*/

#include <Servo.h>

Servo myservo;  // create servo object to control a servo

int potpin = 0;  // analog pin used to connect the potentiometer
int val;    // variable to read the value from the analog pin

void setup() {
  myservo.attach(9);  // attaches the servo on pin 9 to the servo object
}

void loop() {
 // val = analogRead(potpin);            // reads the value of the potentiometer (value between 0 and 1023)
  val = map(val, 0, 1023, 0, 180);     // scale it to use it with the servo (value between 0 and 180)
  myservo.write(val);                  // sets the servo position according to the scaled value
  delay(15);                           // waits for the servo to get there
}

http://playground.arduino.cc/Main/RotaryEncoders

уверен что найдете кто поможет собрать  один проект из этих примеров

mat
2016-02-05 17:31:49

Ребята, вы разговариваете не с коллегой, а сапожником. Да, конечно, я могу поменять прошивку на валенках но, это совсем не то, о чём вы подумали. Конечно же, всё, что я здесь привёл, это я тупо надёргал в инете фрагменты, немного переписал, чтобы было похоже на мои нужды но, от этого, я не стал лучше понимать, что я делаю. Поэтому и попросил, напишите пожалуйста для меня скетч, пусть он не совсем идеальный но, я хоть буду знать что, он РАБОЧИЙ и когда я уверен что это работает, я уже смогу что- то понимать.
Нет, двигатель у меня не шаговый, а серво. И не та серва, что поворачивает вал на ограниченный угол, а которая может крутить его без ограничений в любую сторону и с любой скоростью, включая и удержание в одном положении. Вот, честно копал интернет, в поисках похожего, не нашёл. Попадался чем- то похожий на мои нужды но, там было такое накручено что я просто отказался. Правда, начало оттуда украл. Каюсь.
Напишите пожалуйста, хоть кусочек, чтобы, вращая энкодер, двигатель вращался со скоростью скажем, в два раза ниже. Или выше, как вам будет удобнее.

Йожэг
2016-02-05 16:52:35

Если у вас шаговые двигатели, то предлагаю вам сначала собрать и воспроизвести какой-нибудь пример для них (для одного), а потом попробовать его изменить.
Пример примера: https://www.arduino.cc/en/Tutorial/StepperSpeedControl

qwe
2016-02-05 16:38:04

Вы не понимаете что вы делаете!

mat
2016-02-05 16:22:34

#include <avr/pgmspace.h>

/////////////////////////////////////////////////////////
// ***** Параметры *****
#define Motor_X_Step_Per_Rev    500      // Кол-во шагов/об, мотор 1
#define Motor_Y_Step_Per_Rev    500      // Кол-во шагов/об, мотор 2
#define Enc_Line_per_Rev        500      // Кол-во линий энкодера


// ***** Motor *****
#define MotorPort                    PORTD
#define MotorInitialization()        DDRD=B11111111

#define Motor_X_SetPulse()           MotorPort &= ~(1<<0)
#define Motor_X_RemovePulse()        MotorPort |= (1<<0)
#define Motor_X_InvertPulse()        MotorPort ^= (1<<0)

#define Motor_Y_SetPulse()           MotorPort &= ~(1<<1)
#define Motor_Y_RemovePulse()        MotorPort |= (1<<1)
#define Motor_Y_InvertPulse()        MotorPort ^= (1<<1)

#define Motor_X_CW()                 MotorPort &= ~(1<<2)
#define Motor_X_CCW()                MotorPort |= (1<<2)
boolean Motor_X_CW_flag = true;

#define Motor_Y_CW()                 MotorPort |= (1<<3)
#define Motor_Y_CCW()                MotorPort &= ~(1<<3)
boolean Motor_Y_CW_flag = true;

#define Motor_X_Enable()             MotorPort |= (1<<4)
#define Motor_X_Disable()            MotorPort &= ~(1<<4)

#define Motor_Y_Enable()             MotorPort |= (1<<5)
#define Motor_Y_Disable()            MotorPort &= ~(1<<5)

boolean Step_On_flag = false;
boolean X_Feed_flag = false;
boolean Y_Feed_flag = false;


// ***** Encoder *****
#define Enc_Tick                      Enc_Line_per_Rev*2
#define EncoderPort                   PORTD
#define EncoderInitialization()       DDRD=B00000000;\
                                      PORTD = B00001111
                                     
#define Enc_Read                      (PIND & B00000010)
volatile int Enc_Pos = 0;
volatile byte Ks_Count = 0;
volatile int Km_Count = 0;
byte Ks_Divisor = 0;
int Km_Divisor = 0;
int Enc_Pos_tmp = 0;
long Spindle_Angle = 0;
#define Spindle_Direction_CW         0
#define Spindle_Direction_CCW        1
boolean Spindle_Direction = Spindle_Direction_CW;

//////////////////////////////////////////////
void setup()
{
  EncoderInitialization();
  MotorInitialization();
    }
   
   
//////////////////////////////////////////////
void loop()
{
  Enc_Pos_tmp = Enc_Pos;
}

Компиляция не ругалась, выдала, сколько там байт. И чО ? Я уже программист что ли ? Можно загружать и запускать ? Хотя, сам не верю в успех, этого безнадёжного дела... Что скажете, уважаемые гуру ?

mat
2016-02-05 16:04:35

Я чувствую себя настоящим профи от программирования !!! С большим интересом прочитал монологи зубров, о разных способах решения одной и той же задачи. Вот, только не понял, на фига ?
Пойду, попытаюсь ещё натаскать фрагментов кода, для setup и loop. Наверное, скоро вернусь.

Йожэг
2016-02-05 11:53:33

Вот тут написано, как писать на Arduino на чистом C: https://habrahabr.ru/post/247663/
А ещё там есть комменатрий после статьи, что "внутри" Ардуино на самом деле есть прослойка, которая вызывает ваш скетч:

int main(void)
{
	init();

	setup();
    
	for (;;)
		loop();
        
	return 0;
}

Вот она-то и ожидает от вашей программы наличия минимума из двух подпрограмм https://www.arduino.cc/en/Tutorial/BareMinimum:

void setup() {
  // put your setup code here, to run once:

}

void loop() {
  // put your main code here, to run repeatedly:

}
mat
2016-02-05 07:52:29

Подскажите пожалуйста, где ошибка ? Набрал такой текст

#include <avr/pgmspace.h>

/////////////////////////////////////////////////////////
// ***** Параметры *****
#define Motor_X_Step_Per_Rev    500      // Кол-во шагов/об, мотор 1
#define Motor_Y_Step_Per_Rev    500      // Кол-во шагов/об, мотор 2
#define Enc_Line_per_Rev        500      // Кол-во линий энкодера


// ***** Motor *****
#define MotorPort                    PORTD
#define MotorInitialization()        DDRD=B11111111

#define Motor_X_SetPulse()           MotorPort &= ~(1<<0)
#define Motor_X_RemovePulse()        MotorPort |= (1<<0)
#define Motor_X_InvertPulse()        MotorPort ^= (1<<0)

#define Motor_Y_SetPulse()           MotorPort &= ~(1<<1)
#define Motor_Y_RemovePulse()        MotorPort |= (1<<1)
#define Motor_Y_InvertPulse()        MotorPort ^= (1<<1)

#define Motor_X_CW()                 MotorPort &= ~(1<<2)
#define Motor_X_CCW()                MotorPort |= (1<<2)
boolean Motor_X_CW_flag = true;

#define Motor_Y_CW()                 MotorPort |= (1<<3)
#define Motor_Y_CCW()                MotorPort &= ~(1<<3)
boolean Motor_Y_CW_flag = true;

#define Motor_X_Enable()             MotorPort |= (1<<4)
#define Motor_X_Disable()            MotorPort &= ~(1<<4)

#define Motor_Y_Enable()             MotorPort |= (1<<5)
#define Motor_Y_Disable()            MotorPort &= ~(1<<5)

boolean Step_On_flag = false;
boolean X_Feed_flag = false;
boolean Y_Feed_flag = false;


// ***** Encoder *****
#define Enc_Tick                      Enc_Line_per_Rev*2
#define EncoderPort                   PORTD
#define EncoderInitialization()       DDRD=B00000000;\
                                      PORTD = B00001111
                                     
#define Enc_Read                      (PIND & B00000010)
volatile int Enc_Pos = 0;
volatile byte Ks_Count = 0;
volatile int Km_Count = 0;
byte Ks_Divisor = 0;
int Km_Divisor = 0;
int Enc_Pos_tmp = 0;
long Spindle_Angle = 0;
#define Spindle_Direction_CW         0
#define Spindle_Direction_CCW        1
boolean Spindle_Direction = Spindle_Direction_CW;

и после компиляции получаю

core.a(main.cpp.o): In function `main':
C:\Users\Андрей\Desktop\Arduino\arduino-1.0.2-windows\hardware\arduino\cores\arduino/main.cpp:11: undefined reference to `setup'
C:\Users\Андрей\Desktop\Arduino\arduino-1.0.2-windows\hardware\arduino\cores\arduino/main.cpp:14: undefined reference to `loop'

На сколько у меня ума хватает, я до этого ещё даже не дошёл... Или, нужно просто набирать текст программы полностью, с этими setup и loop ?

mat
2016-02-04 14:01:29

Хорошо, спасибо. Попробую такой фокус.

Йожэг
2016-02-04 11:41:58

Да у этой Меги ножек хоть отбавляй https://arduino-info.wikispaces.com/MegaQuickRef
Можно попробовать заменить, например, на 22-ую. Для этого надо также заменить в программе 20 на 22 (там, где это относится к подгоревшей ножке).

mat
2016-02-03 23:44:09

Я наверное не очень понятно написал... У меня на Arduino Mega 2560 для ввода сигналов Step и Dir были задействованы 20 и 21 выводы. Номера даю по плате Arduino. Похоже что, пока экспериментировал, один вход подпалил, кажется 20. Вот я и подумал, если порт это 8 бит т. е. 8 ножек, может быть можно перенести на другую ножку, чтобы через неё подать сигнал ? Сам пока не могу разобраться, там всё по- намешано... Не подскажите ? Или другую покупать ? Хотя, я уже заказал новую...

Йожэг
2016-02-03 21:22:47

Ножки для вывода можно использовать какие угодно, но некоторые -- ценный ресурс, так как они умеют считывать аналоговый сигнал, могут выдавать PWM, способны вызывать программные прерывания в ответ на изменения входного сигнала, а на некоторых из них выведены аппаратные интерфейсы для связи, в т.ч. запаянные в сторону компьютера.

mat
2016-02-03 12:40:35

Спасибо большое, хоть что- то уже понятнее стало. А такой вопрос, если я правильно понял, для сигналов Enable, Step и Dir я могу использовать три ножки одного порта, то бишь три бита. А влияет ли как- то порядок этих битов или старшинство, или как там правильно называется очерёдность этих битов в байте ? Другими словами, как это отражается в записи программы ? И остальные 5 ножек - битов, я могу использовать для других целей скажем, резервировать ? Почему интересуюсь ? Я тут, пока осваивал эту премудрость, похоже, один выход спалил или подпалил на своей Arduino. Сейчас сигнал, как бы трёхуровневый, на осциллографе смотрю. Даже сигналы с энкодера, когда в воздухе, сигнал нормальный, два уровня 0 и 1, подключаю к выводам Arduino сигнал становится уже с тремя уровнями. Вот и подумал, на другую ножку можно его перевести ? И как ?

Йожэг
2016-02-03 11:44:24
mat пише:

Мне ещё такой момент не понятен. Arduino 8 разрядная, а как это выглядит физически ? Каждый бит имеет свою ножку ? Например, я подал импульс на вход, а на разрядность мне нужно как- то ориентироваться ? Импульс вроде один, а битов 8... Не понятно.

Разрядность умного камня aka CPU или MCU заметна, прежде всего, в разрядности его регистров общего назначения, в т.ч. самого популярного регистра - аккумулятора. Естественно, что арифметико-логическое устройство заточено под ту же самую разрядность (но может использовать два регистра результата для операций типа умножения, потому что иначе результат девать некуда будет).

На что это влияет? Например, порты ввода-вывода такой же ширины, при том что эти порты у микроконтроллера из Ардуино занимают большую часть ножек. А ещё на скорость обработки целочисленных данных, так как за одну арифметическую операцию размер числа ограничен количеством бит машинного слова. Не проблема обработать "длинное" число за пару проходов, но это же время. Ещё малая разрядность отражается в малой разрядности различных шин, адресуемой памяти. Представьте себе только, как рассчитать указатель, используя 8-битный регистр, если у вас данные хранятся по адресу около 1 мегабайта - это три захода при прямой адресации, что, конечно, немного обходится регистрами сегментов памяти, но это уже совсем другая сказка.

Все входы одного порта можно за раз (за операцию) читать-писать. Да, каждый бит там имеет свою ножку. Но можно обращаться выборочно к отдельным ножкам.

mat
2016-02-03 10:59:24

Ну что ж, спасибо и на этом. Желаю и вам успехов.

Підвал форуму