27 МОСКОВСКАЯ ВСТРЕЧА
Форум самогонщиков Сайт Барахолка Магазин 27 МОСКОВСКАЯ ВСТРЕЧА

Arduino или дешевая автоматика

Форум самогонщиков Автоматика
1 ... 3 4 5 6 6
Mnz Магистр Город 254 86
Отв.100  18 Февр. 16, 15:40
Алексей10, у вас есть опыт программирования?

ADCSRA это регистр А управления и состояния аналогово-цифрового преобразователя.
ADPS0 это один из битов регистра ADCSRA задающий частоту преобразования.
Информацию об этом можно найти в даташите (техническом руководстве) микроконтроллера. Если английский плохо знаете, найдите книгу Евстифеева "Микроконтроллеры AVR семейства Mega" и ищите ответы в ней на подобные вопросы.
makh Профессор Sаmara 2.1K 1K
Отв.101  18 Февр. 16, 17:40
набор букв и гнутых скобок!Алексей10, 18 Февр. 16, 11:41
Arduino или дешевая автоматика
Arduino или дешевая автоматика. Автоматика.

Для таких вот персонажей, которым читать мануалы на процессоры непонятно, и делали ардуину. Чтобы на совсем понятном английском из ста слов не думая колдырить, ценой более громоздкого и тормознутого кода. Стяни Arduino IDE, там примеры понятней будут.
Алексей10 Новичок Россия 7
Отв.102  18 Февр. 16, 18:08, через 29 мин
Mnz, спасибо за объяснения и книгу. Буду разбираться.

makh, простые примеры похожие на этот
// the setup function runs once when you press reset or power the board
void setup() {
  // initialize digital pin 13 as an output.
  pinMode(13, OUTPUT);
}

// the loop function runs over and over again forever
void loop() {
  digitalWrite(13, HIGH);  // turn the LED on (HIGH is the voltage level)
  delay(1000);              // wait for a second
  digitalWrite(13, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);              // wait for a second
}
немного понятны, а вот посложнее, уже сплошная каша.
Может есть что-то по проще чем Arduino IDE где возможно написать программу и запрограммировать ее в Arduino?
Путаюсь в этих фигурных скобках. Зачем вообще они нужны? Без них никак?
m16 Модератор Тамбов 1.9K 1K
Отв.103  18 Февр. 16, 18:27, через 19 мин
Алексей10, не захламляй ветку, тебе всё ответили.
Mnz Магистр Город 254 86
Отв.104  18 Февр. 16, 20:16
Может есть что-то по проще чем Arduino IDE где возможно написать программу и запрограммировать ее в Arduino?Алексей10, 18 Февр. 16, 18:08
Если нужно совсем просто, тогда можно присмотреться к FLProg. Но я бы не стал рекомендовать эту программу. Не пробовал но могу предположить что код получится не совсем оптимальный, хотя судя тестам Arduino IDE (в статье это Wiring) создает не самый оптимальный код.
Если хотите чего-то другого, не Arduino IDE, можете взглянуть на эту статью. https://geektimes.ru/post/257504/ Но все равно нужно уметь программировать и иметь хоть приблизительное представление как работает микроконтроллер.
kazu Кандидат наук Харьков 375 74
Отв.105  18 Февр. 16, 20:21, через 6 мин
Путаюсь в этих фигурных скобках. Зачем вообще они нужны? Без них никак?Алексей10, 18 Февр. 16, 18:08
Керниган и Ричи "Язык программирования С" гуглится с полпинка. И/или на амперке почитать и посмотреть.
makh Профессор Sаmara 2.1K 1K
Отв.106  18 Февр. 16, 20:38, через 17 мин
Алексей10, можно и без скобок, раз так сильно не нравятся, на ассемблере. Но все же, ИМХО, лучше учебник по Сишечке почитать. На ассемблере писать уж точно никак не получится без мануала на процессор.
Mnz Магистр Город 254 86
Отв.107  18 Февр. 16, 21:14, через 37 мин
makh, не обязательно на ассемблере. Ардуина это микроконтроллер с обвязкой и прошивку можно написать почти на чем угодно, компилирующем для ATmega.
Если знания о процессоре минимальны, то наверное лучше всего подойдет BASCOM-AVR. Пример Blink будет иметь такой вид.
$regfile = "m328pdef.dat"                                   ' ATmega328P.
$crystal = 16000000                                        ' Частота задающего генератора, Гц.
$hwstack = 64                                              ' Размер стеков.
$swstack = 64
$framesize = 64

Config Portb.5 = Output                                    ' PortB.5 настроен выходом.

Do
  Portb.5 = 1                                              ' Логическая 1 на выводе PortB.5
  Wait 1                                                    ' Задержка 1 секунда.
  Portb.5 = 0                                              ' Логический 0 на выводе PortB.5
  Wait 1                                                    ' Задержка 1 секунда.
Loop
В этом простом примере не видно, но в коде по сложнее во многих случаях нет необходимости в знании устройсва контроллера и его регистров. Допустим, настройка таймера 1 выполняется командой Config Timer1 Таймер возможно настроить как счетчик, таймер или источник ШИМ, так же задать коэффициент деления предделителя и условия сравнения. И конечно же можно назначить подпрограмму обработки прерываний. Аналогично настраиваются другие модули ATmega.
makh Профессор Sаmara 2.1K 1K
Отв.108  18 Февр. 16, 23:23
Ну да, без скобочек, и не ассемблер ))
Думаю, однако, что коллеге не поможет ничего кроме книжек на данном этапе. 
kazu Кандидат наук Харьков 375 74
Отв.109  18 Февр. 16, 23:26, через 4 мин
Что то мне это напоминает... А, точно - можно грабить корованы.
сообщение удалено
Алексей10 Новичок Россия 7
Отв.110  19 Февр. 16, 18:00
Пример Blink будет иметь такой вид.Mnz, 18 Февр. 16, 21:14
Визуально выглядит более чистым (без лишних символов) чем в Arduino IDE. Если вам не трудно, можете показать пример по сложнее. Интересно было бы взглянуть на считывание температуры с DS18B20. Заранее спасибо.
makh Профессор Sаmara 2.1K 1K
Отв.111  19 Февр. 16, 18:10, через 10 мин
Алексей10, научись для начала спрашивать вопросы у гугла. А то ведь обвинят в троллинге (вполне заслуженно), да и забанят н@х. https://www.google.com/search?q=bascom+avr+ds18b20+example

Добавлено через 12мин.:

Посмотрел на bascom, вспомнил детство свое голубоглазое, прослезился -- это ж бейсик! Ой-ой .)
Mnz Магистр Город 254 86
Отв.112  20 Февр. 16, 00:51
Интересно было бы взглянуть на считывание температуры с DS18B20. Заранее спасибо.Алексей10, 19 Февр. 16, 18:00
Ответил в новой теме. Если будут вопросы о применении bascom для программирования arduino, спрашивайте там.
wiifm Новичок Cairns, Australia 2
Отв.113  28 Окт. 16, 08:43
Я последовал за эту нить, как вдохновение для использования двигателя клапан и создал новый файл библиотеки Arduino.

Немного прибрал. Zapal

Скрытый текстTwoWayMotorisedBallValve.h

/*
   File:   TwoWayMotorisedBallValve.cpp
   Title:    TwoWayMotorisedBallValve.cpp
   Author(s):  wiifm
   Created:    Oct 2016
   License:    GNU General Public License v3

   LICENSE:
   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3 of the License, or
   any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.
*/

#ifndef TWO_WAY_MOTORISED_BALL_VALVE_H
#define TWO_WAY_MOTORISED_BALL_VALVE_H

#define MAX_CYCLE 5000
#define MAX_MOTOR_SPEED 255
#define CALIBRATION_CYCLES 3
#define DEBOUNCE_COUNT 5
#define DEBOUNCE_DELAY 5

#define OPENING 1
#define CLOSING -1
#define STOPPED 0

class TwoWayMotorisedBallValve {

   static volatile bool openLimitReached;
   static volatile bool closeLimitReached;
   static uint8_t openLimitPin;
   static uint8_t closeLimitPin;

 public:

   void begin(double* SetPoint, uint8_t OpenValvePin, uint8_t CloseValvePin, uint8_t MotorSpeedPin, uint8_t OpenLimitPin, uint8_t CloseLimitPin) {

     setPoint = SetPoint;
     openValvePin = OpenValvePin;
     closeValvePin = CloseValvePin;
     motorSpeedPin = MotorSpeedPin;
     openLimitPin = OpenLimitPin;
     closeLimitPin = CloseLimitPin;

     pinMode(openValvePin, OUTPUT);
     pinMode(closeValvePin, OUTPUT);
     pinMode(motorSpeedPin, OUTPUT);
     pinMode (openLimitPin, INPUT_PULLUP);
     pinMode (closeLimitPin, INPUT_PULLUP);

     // set the default motor speed to maximum in both directions
     openMotorSpeed = MAX_MOTOR_SPEED;
     closeMotorSpeed = MAX_MOTOR_SPEED;

     closeLimitReached = (digitalRead(closeLimitPin) == LOW ? true : false);
     openLimitReached = (digitalRead(openLimitPin) == LOW ? true : false);

     calibrate();
     
     fullyClose();
     currentPosition = 0;

     lastUpdate = millis() - 1;

   }

   long fullyClose() {

     unsigned long startTime, endTime;
     startTime = millis();

     while (!closeLimitReached) motor(CLOSING);

     endTime = millis();
     motor(STOPPED);

     return (long) (endTime - startTime);

   }

   long fullyOpen() {

     unsigned long startTime, endTime;
     startTime = millis();

     while (!openLimitReached) motor(OPENING);

     endTime = millis();
     motor(STOPPED);

     return (long) (endTime - startTime);

   }

   void update() {

     static unsigned long now;

     now = millis();
     if ((now - lastUpdate) > 0) {

       *setPoint = floor(min(max(0, *setPoint), cycleTime)+0.5);

       currentPosition = currentPosition + (currentStatus * (now - lastUpdate));
       lastUpdate = now;

       if (currentStatus != STOPPED) {
         if (openLimitReached) {
           motor(STOPPED);
           currentPosition = cycleTime;
         }
         if (closeLimitReached) {
           motor(STOPPED);
           currentPosition = 0;
         }
         if (currentPosition == *setPoint) motor(STOPPED);
       }

       if ((currentPosition < *setPoint) && (currentStatus != OPENING)) motor(OPENING);
       if ((currentPosition > *setPoint) && (currentStatus != CLOSING)) motor(CLOSING);

   // Un-comment the line below to plot target position and current positioon using Serial Plotter.  NOTE:  All other Serial.print commands must be commented out of the code.
       //Serial.print(*setPoint); Serial.print(","); Serial.println(currentPosition);
     }

   }

   long getCycleTime() {

     return cycleTime;

   }

   bool isFullyClosed() {

     return (currentPosition == 0);
     
   }

   bool isFullyOpened() {

     return (currentPosition == cycleTime);

   }

 private:

       void motor(int Direction) {

     currentStatus = Direction;

     switch (Direction) {
       case OPENING:
         detachInterrupt(digitalPinToInterrupt(closeLimitPin));
         closeLimitReached = false;
         analogWrite (motorSpeedPin, openMotorSpeed);
         digitalWrite (openValvePin, HIGH);
         digitalWrite (closeValvePin,  LOW);
         attachInterrupt(digitalPinToInterrupt(openLimitPin), openLimitISR, FALLING);
         break;
       case CLOSING:
         detachInterrupt(digitalPinToInterrupt(openLimitPin));
         openLimitReached = false;
         analogWrite (motorSpeedPin, closeMotorSpeed);
         digitalWrite (closeValvePin, HIGH);
         digitalWrite (openValvePin,  LOW);
         attachInterrupt(digitalPinToInterrupt(closeLimitPin), closeLimitISR, FALLING);
         break;
       case STOPPED:
         detachInterrupt(digitalPinToInterrupt(openLimitPin));
         detachInterrupt(digitalPinToInterrupt(closeLimitPin));
         digitalWrite (openValvePin, LOW);
         digitalWrite (closeValvePin,  LOW);
     }

   }

   static void openLimitISR() {

     if (!openLimitReached) {
       openLimitReached = debounceInputPullupPin(openLimitPin);
     }

   }

   static void closeLimitISR() {

     if (!closeLimitReached) {
       closeLimitReached = debounceInputPullupPin(closeLimitPin);
     }

   }

   static bool debounceInputPullupPin(uint8_t Pin) {

     int currentState;
     int lastState = LOW;
     int count = 0;

     while (count <= DEBOUNCE_COUNT) {

       delay(DEBOUNCE_DELAY);
       currentState = digitalRead(Pin);

       if (currentState == lastState) {
         count++;
       } else {
         count = 0;
         lastState = currentState;
       }
     }
     return (currentState == LOW);
   }

   void calibrate() {

     long totalOpeningTime = 0;
     long totalClosingTime = 0;
     float factor = 1;

     fullyClose();

     for (int i = 0; i < CALIBRATION_CYCLES; i++) {
       totalOpeningTime = totalOpeningTime + fullyOpen();
       totalClosingTime = totalClosingTime + fullyClose();
     }

     if ((totalOpeningTime - totalClosingTime) > 0) {
       cycleTime = (int) (((float) totalOpeningTime / CALIBRATION_CYCLES) + 0.5);
       //need to slow closing down
       factor = (float) totalClosingTime / (float) totalOpeningTime;
       closeMotorSpeed = (int) ((openMotorSpeed * factor) + 0.5);
     }

     if ((totalOpeningTime - totalClosingTime) < 0) {
       cycleTime = (int) (((float) totalClosingTime / CALIBRATION_CYCLES) + 0.5);
       //need to slow opening down
       factor = (float) totalOpeningTime / (float) totalClosingTime;
       openMotorSpeed = (int) ((closeMotorSpeed * factor) + 0.5);
     }

   }

   uint8_t closeValvePin;
   uint8_t openValvePin;
   uint8_t motorSpeedPin;

   unsigned long lastUpdate;

   double *setPoint;
   long currentPosition;
   int currentStatus;

   int openMotorSpeed;
   int closeMotorSpeed;
   long cycleTime;

};
#endif


This Arduino sketch implements the library then makes the valve move to random open positions.

Random.ino

#include "TwoWayMotorisedBallValve.h"
//#include <TwoWayMotorisedBallValve.h>

#define OPEN_VALVE_PIN 12
#define CLOSE_VALVE_PIN 13
#define MOTOR_SPEED_PIN 10
#define OPEN_LIMIT_PIN 2
#define CLOSE_LIMIT_PIN 3

volatile bool TwoWayMotorisedBallValve::openLimitReached;
volatile bool TwoWayMotorisedBallValve::closeLimitReached;
uint8_t TwoWayMotorisedBallValve::openLimitPin;
uint8_t TwoWayMotorisedBallValve::closeLimitPin;

TwoWayMotorisedBallValve valve;

double valveSetPoint;

unsigned long lastRandom = 0;

void setup ()
{

 Serial.begin(9600);
 valve.begin(&valveSetPoint, OPEN_VALVE_PIN, CLOSE_VALVE_PIN, MOTOR_SPEED_PIN, OPEN_LIMIT_PIN, CLOSE_LIMIT_PIN);

}

void doFunctionAtInterval(void (*callBackFunction)(), unsigned long *lastEvent, unsigned long Interval) {

 unsigned long now = millis();

 if ((now - *lastEvent) >= Interval) {
   callBackFunction();
   *lastEvent = now;
 }

}

void loop ()
{

 doFunctionAtInterval(generateRandomOutput, &lastRandom, 200);
 valve.update();

}

void generateRandomOutput() {

 int change = random(-1000, 1001);
 valveSetPoint = min(max(0, (valveSetPoint + change)), valve.getCycleTime());
 
}
capsolo Профессор Зелик 5.3K 1.6K
Отв.114  28 Окт. 16, 08:58, через 15 мин
wiifm, может код как-то в виде файла выкладывать? Мозг взрывает листать. А и еще градусник можно взять dallas ds18b20, гильзованный меньше бакса, а сдачу 11 баксов пропить с друзьями. далласовский датчик отлично поддерживается библиотеками Ардуины.
Ну и напиши что хочешь с этим делать всем добром, ибо пока все выглядит как троллинг и гугл транслейт, который ты публикуешь по непонятной причине.
wiifm Новичок Cairns, Australia 2
Отв.115  28 Окт. 16, 12:22
Я не могу говорить по-русски, как я из Австралии. К сожалению для Google Translate. Я приложил файлы. Существует три примера, а также код библиотеки.
alex_ustus Специалист Nyagan 161 9
Отв.116  26 Февр. 17, 20:08
сорян за нубский вопрос; но пролистав всю ветку не увидел всей схемы подключения и "финишного" скетча. Есть у кого уже готовый проект на данном железе?