@mIka01

Как исправить проблемы с шаговым двигателем?

ЧПУ на Arduino. Джойстиком выбирается ход по оси X, Y с одновременным выводом на VGA экран. Оператор нажимает на джойстик и шаговые двигатель двигаются. Не получается привести работу шаговиков и vga.
Я использую библиотеку для вывода изображения на экран. Обернул это все в функцию output();
spoiler
void output() {
  VGAX vga;
  Serial.println("Start");
  boolean  button = false;
  boolean  output = true;
  vga.begin();

  while (output) {
    char stri[10];
    static const char str[] PROGMEM = "Move on";
    static const char str0[] PROGMEM = "X = ";
    static const char str1[] PROGMEM = "Y = ";
    static const char str2[] PROGMEM = "Tact = ";

    static const char str3[] PROGMEM = "Yoke = ";

    double a1 = (analogRead (A1) / 10) - 51;
    double a2 = (analogRead (A2) / 10) - 51;
    int a3 = analogRead (A5) / 10;

    xVa += map(a1, -51, 51, -a3, a3) / 100.0;
    yVa += map(a2, -51, 51, -a3, a3) / 100.0;

    if ((a1 != 0) || (a2 != 0) || (a3_copi != a3)) {
      a3_copi = a3;
      vga.clear(BLACK);
      vga.printPROGMEM((byte*)fnt_nanofont_data, FNT_NANOFONT_SYMBOLS_COUNT, FNT_NANOFONT_HEIGHT, 3, 1, str, 10, 0, RED);
      vga.printPROGMEM((byte*)fnt_nanofont_data, FNT_NANOFONT_SYMBOLS_COUNT, FNT_NANOFONT_HEIGHT, 3, 1, str0, 10, 10, RED);
      dtostrf(xVa, 3, 2, stri);
      vgaPrint(stri, 30, 10, RED, vga);

      vga.printPROGMEM((byte*)fnt_nanofont_data, FNT_NANOFONT_SYMBOLS_COUNT, FNT_NANOFONT_HEIGHT, 3, 1, str1, 10, 20, RED);
      dtostrf(yVa, 3, 2, stri);
      vgaPrint(stri, 30, 20, RED, vga);
      vga.printPROGMEM((byte*)fnt_nanofont_data, FNT_NANOFONT_SYMBOLS_COUNT, FNT_NANOFONT_HEIGHT, 3, 1, str2, 60, 0, GREEN);
      dtostrf(a3, 3, 2, stri);
      vgaPrint(stri, 90, 0, GREEN, vga);
      vga.printPROGMEM((byte*)fnt_nanofont_data, FNT_NANOFONT_SYMBOLS_COUNT, FNT_NANOFONT_HEIGHT, 3, 1, str3, 60, 10, GREEN);
      dtostrf(a1, 3, 2, stri);
      vgaPrint(stri, 90, 10, GREEN, vga);
      dtostrf(a2, 3, 2, stri);
      vgaPrint(stri, 90, 20, GREEN, vga);
      button = true;
    } else {
      if (button) {
        vga.clear(BLACK);
        vga.printPROGMEM((byte*)fnt_nanofont_data, FNT_NANOFONT_SYMBOLS_COUNT, FNT_NANOFONT_HEIGHT, 3, 1, str, 10, 0, RED);
        vga.printPROGMEM((byte*)fnt_nanofont_data, FNT_NANOFONT_SYMBOLS_COUNT, FNT_NANOFONT_HEIGHT, 3, 1, str0, 10, 10, RED);
        dtostrf(xVa, 3, 2, stri);
        vgaPrint(stri, 30, 10, RED, vga);
        vga.printPROGMEM((byte*)fnt_nanofont_data, FNT_NANOFONT_SYMBOLS_COUNT, FNT_NANOFONT_HEIGHT, 3, 1, str1, 10, 20, RED);
        dtostrf(yVa, 3, 2, stri);
        vgaPrint(stri, 30, 20, RED, vga);
        vga.printPROGMEM((byte*)fnt_nanofont_data, FNT_NANOFONT_SYMBOLS_COUNT, FNT_NANOFONT_HEIGHT, 3, 1, str2, 60, 0, GREEN);
        dtostrf(a3, 3, 2, stri);
        vgaPrint(stri, 90, 0, GREEN, vga);

        vga.printPROGMEM((byte*)fnt_nanofont_data, FNT_NANOFONT_SYMBOLS_COUNT, FNT_NANOFONT_HEIGHT, 3, 1, str3, 60, 10, GREEN);
        dtostrf(a1, 3, 2, stri);
        vgaPrint(stri, 90, 10, GREEN, vga);
        dtostrf(a2, 3, 2, stri);
        vgaPrint(stri, 90, 20, GREEN, vga);
        vga.delay(100);
        dtostrf(0, 3, 2, stri);
        vgaPrint(stri, 90, 10, GREEN, vga);
        dtostrf(0, 3, 2, stri);
        vgaPrint(stri, 90, 20, GREEN, vga);

        button = false;
      }
    }
    if (digitalRead(0) == LOW)  {
      static const char str0[] PROGMEM = "start";
      vga.printPROGMEM((byte*)fnt_nanofont_data, FNT_NANOFONT_SYMBOLS_COUNT, FNT_NANOFONT_HEIGHT, 3, 1, str0, 0, 0, GREEN);
      delay(5000);
      vga.end();
      output = false;
    }

    vga.delay(100);
  }
}
void vgaPrint(char * str, byte x, byte y, byte color, VGAX vga) {
  vga.printSRAM((byte*)fnt_nanofont_data, FNT_NANOFONT_SYMBOLS_COUNT, FNT_NANOFONT_HEIGHT, 3, 1, str, x, y, color);
}


spoiler
#include <VGAX.h>
#include "glyph.h"

#define BLACK  0
#define RED    1
#define GREEN  2
#define YELLOW 3

glyph.h файл.
//font generated from BITFONZI - by Sandro Maffiodo
#define FNT_NANOFONT_HEIGHT 6
#define FNT_NANOFONT_SYMBOLS_COUNT 95
//data size=570 bytes
const unsigned char fnt_nanofont_data[FNT_NANOFONT_SYMBOLS_COUNT][1+FNT_NANOFONT_HEIGHT] PROGMEM={
{ 1, 128, 128, 128, 0, 128, 0, }, //glyph '!' code=0
{ 3, 160, 160, 0, 0, 0, 0, }, //glyph '"' code=1
...
{ 3, 96, 192, 0, 0, 0, 0, },  //glyph '~' code=93
{ 4, 48, 64, 224, 64, 240, 0, },  //glyph '£' code=94
};

Вывод на экран работает.
Код шагового двигателя обернутого в функцию servo();.
void servo() {
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
  pinMode(in3, OUTPUT);
  pinMode(in4, OUTPUT);
  int dl = 5;
  for (int i = 0; i < 200; i++) {
    digitalWrite(in1, HIGH);
    digitalWrite(in2, LOW);
    digitalWrite(in3, LOW);
    digitalWrite(in4, HIGH);
    delay(dl);

    digitalWrite(in1, HIGH);
    digitalWrite(in2, HIGH);
    digitalWrite(in3, LOW);
    digitalWrite(in4, LOW);
    delay(dl);

    digitalWrite(in1, LOW);
    digitalWrite(in2, HIGH);
    digitalWrite(in3, HIGH);
    digitalWrite(in4, LOW);
    delay(dl);

    digitalWrite(in1, LOW);
    digitalWrite(in2, LOW);
    digitalWrite(in3, HIGH);
    digitalWrite(in4, HIGH);
    delay(dl);
  }
}

Двигатель работает. Однако объединяя эти функции все ломается.
  • Вопрос задан
  • 213 просмотров
Пригласить эксперта
Ответы на вопрос 2
@evgeniy_lm
Тут без бутылки не разберешся (хорошей, такой, бутылки).
Но в общем и целом чего это setup() у вас пустой? Как минимум там должна быть инициализация Serial. Так же туда нужно перенести инициализацию всего что у вас есть.
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
pinMode(in3, OUTPUT);
pinMode(in4, OUTPUT);

VGAX vga;
vga.begin();

возможно что то еще упустил

ЗЫ Как по мне юзать униполярники плохая идея. Биполярников можно с любой старой техники наковырять мешок, драйвера стоят копейки, а возможностей и качество работы куда лучше. Можно замутьтить реално работающий полезный девайс
Ответ написан
gbg
@gbg Куратор тега Arduino
Любые ответы на любые вопросы
Вероятнее всего, все ресурсы контроллера уходят на генерацию VGA-сигнала. Поэтому, ресурсов на генерацию фаз для шаговика уже не хватает.

Решение - использовать два контроллера.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы