Проблема прошивки проектов с двумя моторами

Тема в разделе "Iskra JS, Espruino, Йодо", создана пользователем ManWell, 12 апр 2021.

  1. ManWell

    ManWell Нуб

    Здравствуйте!

    Проект "Марсоход" также с двумя моторами. Но отработал без проблем.
    А вот, например, проект "Чистюля" уже начал "хулиганить".

    Идея кода взята со страницы: http://wiki.amperka.ru/robot
    "Загрузи код в Iskra JS, поставь Робоняшу на светлый стол, а затем нажми кнопку PLAY на пульте."
    Код (Javascript):

    var FORWARD_SPEED = 0.3;
    var BACKWARD_SPEED = 0.8;
    var BORDER_VALUE = 0.2;
    var intervalID;

    var cleaner = require('robot-2wd').connect();
    var receiver = require('ir-receiver').connect(P3);
    var lineSensor = require('analog-line-sensor');
    var leftSensor = lineSensor.connect(A0);
    var rightSensor = lineSensor.connect(A1);

    function clean()
    {
      if (leftSensor.read() > BORDER_VALUE)
      {
        cleaner.go({l: 0, r: -BACKWARD_SPEED});
      }
      else if (rightSensor.read() > BORDER_VALUE)
      {
        cleaner.go({l: -BACKWARD_SPEED, r: 0});
      }
      else
      {
        cleaner.go({l: FORWARD_SPEED, r: FORWARD_SPEED});
      }
    }

    receiver.on('receive', function(code)
    {
    if (code === receiver.keys.PLAY)
    {
       if (!intervalID)
       {
         leftSensor.calibrate({white: leftSensor.read()});
         rightSensor.calibrate({white: rightSensor.read()});
         intervalID = setInterval(clean, 10);
       }
       else
       {
         cleaner.stop();
         intervalID = clearInterval(intervalID);
       }
    }
    });
     
    До этого эксперимент с датчиками линии
    Код (Javascript):
    var analogSensor = require('analog-line-sensor')
      .connect(A0);
    var showSignal = function() {
      print('signal:', analogSensor.read('V'), 'volts');
    };
    setInterval(showSignal, 100);
    удался вполне нормально.

    Но при загрузке "прошивки" появляется вот такое сообщение:

    Код (Javascript):
    ERROR: SD card must be setup with E.connectSDCard first
    WARNING: Module "motor" not found
    Uncaught Error: Field or method "MotorShield" does not already exist, and can't create it on undefined
    at line 1 col 31
    a=a||{};var b=require('
    motor').MotorShield;this._leftMotor=a...
                                  ^
    in function "Robot" called from line 1 col 12
    new Robot(a);
               ^
    in function "connect" called from line 7 col 44
    var cleaner = require('
    robot-2wd').connect();
    Как это Module "motor" not found??? Если с 3-й, 5-й или 7-й попытке всё грузится.
    При том, что ничего не меняется. Просто прошивка, при неизменно-подключенном роботе.
    Подскажите, пожалуйста в чем проблема!!

    P.S. Разумеется, эту ветку (http://wiki.amperka.ru/js:ide) читал.
    Скажу честно, немного изменил подход. Закачал все модули локально и поместил все в папку modules. При этом, код robot-2wd.js изменил следующим образом:
    Код (Javascript):
    var Robot = function(opts) {
      opts = opts || {};
      var MotorShield = require('motor').MotorShield;
      this._leftMotor = opts.leftMotor || MotorShield.M1;
      this._rightMotor = opts.rightMotor || MotorShield.M2;

      var acceleration = opts.acceleration || 0.2;
      this.acceleration(acceleration);

      this._speedIntervalID = null;

      this._init();
    };

    Robot.prototype._init = function() {
      var Motor = require('motor'); // как видно, тут тоже без @amperka
      this.leftMotor = Motor.connect(this._leftMotor);
      this.rightMotor = Motor.connect(this._rightMotor);

      this.stop();
    };

    Robot.prototype.stop = function() {
      this._lCurrentSpeed = 0;
      this._rCurrentSpeed = 0;
      if (this._speedIntervalID) {
        clearInterval(this._speedIntervalID);
        this._speedIntervalID = null;
      }
      this.leftMotor.write(this._lCurrentSpeed);
      this.rightMotor.write(-this._rCurrentSpeed);
    };

    Robot.prototype.go = function(opts) {
      opts = opts || {};
      this._lSpeed = opts.l === undefined ? 0 : E.clip(opts.l, -1, 1);
      this._rSpeed = opts.r === undefined ? 0 : E.clip(opts.r, -1, 1);
      if (this._speedIntervalID === null) {
        this._speedIntervalID = setInterval(this._updateSpeed.bind(this), 20);
      }
    };

    Robot.prototype.acceleration = function(acceleration) {
      if (acceleration === undefined) {
        return this._acceleration;
      } else {
        this._acceleration = E.clip(acceleration, 0, 1);
      }
    };

    Robot.prototype._updateSpeed = function() {
      var accel = this.acceleration();
      this._lCurrentSpeed =
        accel * this._lSpeed + (1 - accel) * this._lCurrentSpeed;
      this._rCurrentSpeed =
        accel * this._rSpeed + (1 - accel) * this._rCurrentSpeed;
      this.leftMotor.write(this._lCurrentSpeed);
      this.rightMotor.write(-this._rCurrentSpeed);
    };

    exports.connect = function(opts) {
      return new Robot(opts);
    };
     
    В Settings -> Projects я прописал путь к папке modules, в которой и лежат все скрипты.
    Поэтому при require не использую '@amperka/'

    Спасибо.
     
    Последнее редактирование: 13 апр 2021
  2. ManWell

    ManWell Нуб

    Очевидно, дело в microUSB - разъёме. Так как иногда даже соединиться не получается и выскакивает ошибка: "Unable to retrieve board information. ConnectionError". После подбора положения шнура в разъёме вопрос решается.

    Не по теме:
    Если честно, то в TETRA с разъемом решение верное. Даже в книжке к набору значится: "Способен выдержать жёсткую детскую эксплуатацию". А тут разъём держится только на точечной пайке. Шнур короткий и совсем не гибкий. Плюс ко всему, сам разъем, вероятно, не предназначен для постоянных сочленений - расчленений.
     
    Последнее редактирование: 21 апр 2021