Не удается подключить paj7620 (модуль детектора жестов) к nodemcu

Я пытаюсь подключить paj7620 к микроконтроллеру nodemcu. Я реализовал следующий код, и он отлично работал на arduino uno. Проблема в том, что меня заставили перейти на nodemcu.

Вот мой код:

/*
 * Copyright (c) 2015 seeed technology inc.
 * Website    : www.seeed.cc
 * Author     : Wuruibin
 * Modified Time: June 2015
 * Description: This demo can recognize 15 gestures and output the result. 
 *              You can adjust the reaction time according to the actual circumstance
 *              by modifying "#define GES_REACTION_TIME  500".
 * 
 * The MIT License (MIT)
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */
#include <ESP8266WiFi.h>
#include <Wire.h>
#include "paj7620.h"

/* 
Notice: When you want to recognize the Forward/Backward gesture or other continuous gestures, your gestures' reaction time must less than GES_REACTION_TIME(0.8s). 
        You also can adjust the reaction time according to the actual circumstance.
*/
#define GES_REACTION_TIME       800
#define GES_QUIT_TIME           1000

void setup()
{
    uint8_t error = 0;

    Serial.begin(9600);
    Serial.println("\nPAJ7620U2 TEST DEMO: Recognize 15 gestures.");

    error = paj7620Init();          // initialize Paj7620 registers
    if (error) 
    {
        Serial.print("INIT ERROR,CODE:");
        Serial.println(error);
    }
    else
    {
        Serial.println("INIT OK");
    }
    Serial.println("Please input your gestures:");
    Serial.begin(115200);
  Serial.println();

  // Serial.print("Setting soft-AP configuration ... ");
  // Serial.println(WiFi.softAPConfig(local_IP, gateway, subnet) ? "Ready" : "Failed!");

  Serial.print("Setting soft-AP ... ");
  Serial.println(WiFi.softAP("NODEMCU") ? "Ready" : "Failed!");

  Serial.print("Soft-AP IP address = ");
  Serial.println(WiFi.softAPIP());
}

void loop()
{
    uint8_t data = 0, data1 = 0, error; 

    error = paj7620ReadReg(0x43, 1, &data);             // Read Bank_0_Reg_0x43/0x44 for gesture result.
    if (!error) 
    {
        switch (data)                                   // When different gestures be detected, the variable 'data' will be set to different values by paj7620ReadReg(0x43, 1, &data).
        {
            case GES_RIGHT_FLAG:
                delay(GES_REACTION_TIME);
                paj7620ReadReg(0x43, 1, &data);
                if(data == GES_LEFT_FLAG) 
                {
                    Serial.println("Right-Left");
                }
                else if(data == GES_FORWARD_FLAG) 
                {
                    Serial.println("Forward");
                    delay(GES_QUIT_TIME);
                }
                else if(data == GES_BACKWARD_FLAG) 
                {
                    Serial.println("Backward");
                    delay(GES_QUIT_TIME);
                }
                else
                {
                    Serial.println("Right");
                }          
                break;
            case GES_LEFT_FLAG:
                delay(GES_REACTION_TIME);
                paj7620ReadReg(0x43, 1, &data);
                if(data == GES_RIGHT_FLAG) 
                {
                    Serial.println("Left-Right");
                }
                else if(data == GES_FORWARD_FLAG) 
                {
                    Serial.println("Forward");
                    delay(GES_QUIT_TIME);
                }
                else if(data == GES_BACKWARD_FLAG) 
                {
                    Serial.println("Backward");
                    delay(GES_QUIT_TIME);
                }
                else
                {
                    Serial.println("Left");
                }          
                break;
                break;
            case GES_UP_FLAG:
                delay(GES_REACTION_TIME);
                paj7620ReadReg(0x43, 1, &data);
                if(data == GES_DOWN_FLAG) 
                {
                    Serial.println("Up-Down");
                }
                else if(data == GES_FORWARD_FLAG) 
                {
                    Serial.println("Forward");
                    delay(GES_QUIT_TIME);
                }
                else if(data == GES_BACKWARD_FLAG) 
                {
                    Serial.println("Backward");
                    delay(GES_QUIT_TIME);
                }
                else
                {
                    Serial.println("Up");
                }
                break;
            case GES_DOWN_FLAG:
                delay(GES_REACTION_TIME);
                paj7620ReadReg(0x43, 1, &data);
                if(data == GES_UP_FLAG) 
                {
                    Serial.println("Down-Up");
                }
                else if(data == GES_FORWARD_FLAG) 
                {
                    Serial.println("Forward");
                    delay(GES_QUIT_TIME);
                }
                else if(data == GES_BACKWARD_FLAG) 
                {
                    Serial.println("Backward");
                    delay(GES_QUIT_TIME);
                }
                else
                {
                    Serial.println("Down");
                }
                break;
            case GES_FORWARD_FLAG:
                delay(GES_REACTION_TIME);
                paj7620ReadReg(0x43, 1, &data);
                if(data == GES_BACKWARD_FLAG) 
                {
                    Serial.println("Forward-Backward");
                    delay(GES_QUIT_TIME);
                }
                else
                {
                    Serial.println("Forward");
                    delay(GES_QUIT_TIME);
                }
                break;
            case GES_BACKWARD_FLAG:       
                delay(GES_REACTION_TIME);
                paj7620ReadReg(0x43, 1, &data);
                if(data == GES_FORWARD_FLAG) 
                {
                    Serial.println("Backward-Forward");
                    delay(GES_QUIT_TIME);
                }
                else
                {
                    Serial.println("Backward");
                    delay(GES_QUIT_TIME);
                }
                break;
            case GES_CLOCKWISE_FLAG:
                Serial.println("Clockwise");
                break;
            case GES_COUNT_CLOCKWISE_FLAG:
                Serial.println("anti-clockwise");
                break;  
            default:
                paj7620ReadReg(0x44, 1, &data1);
                if (data1 == GES_WAVE_FLAG) 
                {
                    Serial.println("wave");
                }
                break;
        }
    }
    delay(100);
}
------------------------
|paj7620    | nodemcu  |
------------------------
| VCC       | 3.3v     |
------------------------
| GND       | GND      |
------------------------
| SCL       | D1       |
------------------------
| SDA       | D2       |
------------------------

После подключения портов, подобных приведенной выше таблице, я получаю следующую ошибку, когда пытаюсь загрузить код в nodemcu.

Кто-нибудь поможет мне, как устранить эту ошибку?

Электропроводка

PS Я также попробовал сканер I2C, как упоминал @timemage в комментариях.

PS 2 Он работает правильно, когда я подключаю paj7620 к arduino, компилируя приведенный выше код.

выход:

, 👍0

Обсуждение

Есть ли у вас внешние подтягивающие резисторы на шине I2C? Что еще, если вообще что-то, у вас есть связано с платой?, @timemage

@timemage Извините, я новичок в этой области. не могу понять, что вы сказали. не могли бы вы дать мне более подробную информацию?, @Mostafa Ghadimi

Если вы еще этого не сделали, запустите [I2C scanner](https://playground.arduino.cc/Main/I2cScanner/) и убедитесь, что ваш датчик отображается в нем., @timemage

@timemage Я получил следующую ошибку: ` /packages/esp8266/hardware/esp8266/2.7.4/tools/esptool/esptool.py", строка 672, в flash_defl_block self.ESP_FLASH_DEFL_DATA, struct.pack(', @Mostafa Ghadimi

Вам нужно закрыть последовательный монитор перед загрузкой нового скетча, который выглядит как ошибка загрузки., @Maximilian Gerhardt

В коде сканера I2C нет ничего особенного в отношении загрузки. Таким образом, это звучит так, как будто вы говорите об отдельной и отдельной проблеме, которая должна быть исправлена, прежде чем продолжить этот вопрос. Теперь я могу сказать вам, что до тех пор, пока ваше устройство не появится в сканере, не стоит устранять неполадки с кодом конкретного устройства (скетч или библиотека), потому что проблема находится на более низком уровне. Что-то вроде того, что его неправильно подключили., @timemage

@timemage он был успешно скомпилирован и загружен на плату. но вывод в serial был пуст! :(, @Mostafa Ghadimi

@MaximilianGerhardt Да, ты прав. после запуска этого кода вывод был пуст!, @Mostafa Ghadimi

Возможно, если вы добавите к своему вопросу четкое изображение вашей проводки, что-то выделится., @timemage

@timemage готово!, @Mostafa Ghadimi

Ну а плата CJMCU, похоже, имеет подтягивания I2C разумного размера. Итак, вот и ответ на этот вопрос. Ваши фиолетовые провода в центре слева, похоже, не служат никакой функциональной цели, хотя они безвредны. Похоже, что на этом макете есть только один набор рельсов. Я не уверен, что предложить, кроме как уменьшить проводку, если это возможно, перейти непосредственно от 3,3 В и GND к плате датчика., @timemage

При ближайшем рассмотрении ваша пайка контактов SCL на модуле CJMCU кажется не очень хорошей. Можете ли вы сделать это крупным планом?, @timemage

Вполне возможно,что трехконтактное устройство на вашей сенсорной плате является регулятором 3,3 В и что целью является питание платы от 5 В. Однако я не смог найти никаких схем или правильных спецификаций для него. Так что я неохотно советую тебе попробовать это сделать. Я полагаю, что если вы уже делали это на UNO и это не убило его, то имеет смысл попробовать. Но сначала я бы починил пайку., @timemage


2 ответа


Лучший ответ:

1

Отдельное спасибо @timemage за его поддержку. После борьбы с платой более 6 часов она работает нормально. Позже я опишу и подробно расскажу о том, как была решена эта проблема.

Arduino Uno имеет 5 аналоговых входов, в то время как на nodemcu их нет. Чтобы подключить paj7620 к nodemcu, заметно, что, как сказал @timemage:

- А4 и А5 на UNO-это то место, где находятся сигналы шины I2C ATmega328P. Более ранние версии Arduino UNO и связанных с ними плат не имели выделенных заголовков SDA и SCL, как сейчас. На тех UNO, которые имеют контакты SDA и SCL на верхнем цифровом заголовке, они представляют собой тот же самый точный сигнал, что и на A4 и A5".

Итак, первая схема была правильной.

Как следует из пятой страницы этой ссылки, нет никакой разницы между входами 3,3 В на nodemcu. Но я изменил проводку, как показано на следующем рисунке, и это работает!

#COLOR MAPPING
RED: VCC - 3.3v
BLACK: GND
ORANGE: SCL - D1
GREEN: SDA - D2

Я надеюсь, что это поможет, потому что нет никакого способа отследить проблему. :)

,

Когда у вас появится возможность, попробуйте нагрузочный тест на вашем "плохом" выводе 3,3 В. Просто поставьте туда что-нибудь порядка 50 Ом. Он должен потреблять около 66 мА, а штифт должен оставаться около 3,3 В, если напряжение упадет до нуля, может быть, как-то пометить штифт, чтобы вы не пытались использовать его в будущем. И вы знаете, исправьте пайку, когда сможете. =), @timemage


0

Вы там стали довольно тихими с тех пор, как я предложил увеличить масштаб вашей сенсорной платы. Просто чтобы этот вопрос не циркулировал в системе в течение многих лет, вот ответ:

Zooming in on poorly soldered header.

Ваша пайка должна быть ближе к этому. Надеюсь, лучше, так как это те, которые я сделал:

Soldering

Припой коротко сортирует паутину по бокам штифтов. Для этого используйте термин "филе". Там, где ваши прокладки вокруг сквозного отверстия выглядят шире, чем те, что находятся на плате выше, они, вероятно, должны выглядеть немного лучше. В любом случае в сквозном отверстии не должно быть незаполненных частей. По крайней мере, не с той стороны, которую ты паяешь.

Я ожидаю, что он, по крайней мере, появится в сканере I2C, когда вы это исправите. Он может показывать адрес, отличный от адреса по умолчанию в библиотеке, и в этом случае вам может потребоваться указать ему использовать адрес, отображаемый в сканере.

,

вы правы, но он работает правильно, когда я запускаю приведенный выше код на arduino. Проблема в подключении к nodemcu., @Mostafa Ghadimi

Связь может быть настолько слабой, что не требуется много времени, чтобы повлиять на то, "работает"она или нет., @timemage

Я подключил его к arduino, как [эта картинка](https://i.stack.imgur.com/H5Ll3.jpg). scl к a5 и sda к a4. Как я могу изменить приведенный выше код, который работает одинаково? Я думаю, что проблема заключается в подключении контактов к paj и nodemcu. Но я не нашел никакого ресурса о подключении paj к nodemcu, и я добавил свой код, чтобы увидеть, есть ли у него решение или нет., @Mostafa Ghadimi

Я не верю, что что-то не так со сканером I2C, работающим на esp8266. И я не верю, что стоит иметь дело с вашим оригинальным кодом *до тех пор, пока* он не появится в сканере. Как я уже сказал, я уверен, что проблема в чем-то более фундаментальном., @timemage

Я не знаю, в чем проблема. Я снова отредактировал этот пост. не могли бы вы взглянуть на это?, @Mostafa Ghadimi

Я снова посмотрел на arduino. Я подключил scl к аналоговому входу, в то время как nodemcu не имеет аналогового входа, что мне делать?, @Mostafa Ghadimi

A4 и A5 на UNO находятся там, где находятся сигналы шины I2C ATmega328P. Более ранние версии Arduino UNO и связанных с ними плат не имели выделенных заголовков SDA и SCL, как сейчас. На тех UNO, которые имеют контакты SDA и SCL на верхнем цифровом заголовке, они представляют собой тот же точный сигнал, что и на A4 и A5., @timemage

Давайте [продолжим это обсуждение в чате](https://chat.stackexchange.com/rooms/119513/discussion-between-mostafa-ghadimi-and-timemage)., @Mostafa Ghadimi