Всем доброго времени суток! Заказал у китайцев дешевую и привлекательную по характеристикам плату waveshare rp2040-zero. Тем более, что Arduino IDE также поддерживает эту плату(в ней и пишу код). Неделю проработала прекрасно, потом внезапно перестала определяться компьютером как виртуальный com-порт. При подключении с зажатой кнопкой boot в проводнике появляется диск RPI-RP2. Уже почти неделю пытаюсь что-то найти на данную тему на просторах интернета - безрезультатно. Нашел только, что надо на этот диск в проводнике скинуть прошивку для платы, которую я не смог нигде найти. Нашел только файл, который стирает все из памяти. Сейчас при обычном подключении к компьютеру плата появляется в диспетчере задач в виде “Неизвестное USB-устройство. Сбой запроса дескриптора USB-устройства.” Кстати, делаю на этой плате проект - gps-трекер. Подскажите, пожалуйста, где взять этот файл прошивки, или, может ещё какой финт ушами надо сделать…
Если в проекте будет указано что использовать USB как Serial, то и после заливки будет виртуальный ком порт.
PS
С платой raspberry pi pico происходит то же самое - я не понимаю, в чем проблема. При этом, если попытаться залить скетч, когда плата подключена в режиме boot - плата отвалится в процессе загрузки скетча.
Так и должно быть !
Не понял вас, поясните, пожалуйста
Прошивка RP2040 происходит переводом платы в режим BOOT и копировании файла на появившийся накопитель !
Виртуальный порт должна создать ВАША прошивка !!!
Rasberry PI PICO (RP2040) продолжение темы - Аппаратные вопросы - Arduino.ru
Она отвалится не “в процессе”, а после заливки.
- Подключаете с зажатой кнопкой БУТ
- Нажимаете Upload в Ардуино ИДЕ - и все прошивается. Бут режим при этом отваливается.
ТС у Вас такая строчка в скетче есть ???
вот код проекта, прошу не ругать за криворукость, это пока пробная версия
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SH110X.h>
#include <TinyGPS++.h>
Adafruit_SH1107 display = Adafruit_SH1107(64, 128, &Wire);
TinyGPSPlus gps;
int sat = 0, hour = 0, minute = 0, second = 0;
float lat = 0.0, lng = 0.0;
//char data[182];
bool flagA = 0, flagB = 0, flagC = 0;
bool blink = 0, sleep = 0;
static unsigned long int t = 0, v = 0, s = 0;
byte curScreen = 2, maxScreen = 6;
void mainScreen() {
display.clearDisplay();
display.setTextSize(4);
display.setCursor(5, 18);
display.print(hour);
if (blink) display.print(":");
else display.print(" ");
display.print(minute);
display.setTextSize(1);
display.setCursor(100, 0);
display.print("---");
display.print("%");
display.display();
}
void gpsScreen() {
display.clearDisplay();
display.setTextSize(4);
display.setCursor(5, 18);
display.print("GPS");
display.display();
}
void timerScreen() {
display.clearDisplay();
display.setTextSize(4);
display.setCursor(5, 18);
display.print("timer");
display.display();
}
void page1() {
display.clearDisplay();
display.setTextSize(1);
display.setCursor(0, 0);
display.print("sensorValue=");
display.display();
}
void page2() {
display.clearDisplay();
display.setTextSize(1);
display.setCursor(0, 0);
display.print("Voltage=");
display.display();
}
void page3() {
display.clearDisplay();
display.setTextSize(3);
display.setCursor(0, 0);
display.print("page 3");
display.display();
}
static void smartDelay(unsigned long ms) {
unsigned long start = millis();
do {
while (Serial1.available())
gps.encode(Serial1.read());
} while (millis() - start < ms);
}
void setup() {
pinMode(7, INPUT_PULLUP);
pinMode(8, INPUT_PULLUP);
pinMode(9, INPUT_PULLUP);
Serial.begin(9600);
Serial.print("Hello");
}
void loop() {
if (!digitalRead(7) and !flagA) {
flagA = !flagA;
s = millis();
}
if (digitalRead(7) and flagA) {
flagA = !flagA;
s = millis();
curScreen--;
if (curScreen < 1) curScreen = maxScreen;
}
if (!digitalRead(8) and !flagB) {
flagB = !flagB;
s = millis();
}
if (digitalRead(8) and flagB) {
flagB = !flagB;
s = millis();
curScreen = 2;
}
if (!digitalRead(9) and !flagC) {
flagC = !flagC;
s = millis();
}
if (digitalRead(9) and flagC) {
flagC = !flagC;
s = millis();
curScreen++;
if (curScreen > maxScreen) curScreen = 1;
}
if (millis() - v >= 500) {
v = millis();
blink = !blink;
}
if (millis() - t >= 100) {
t = millis();
if (sleep) {
goto label;
display.clearDisplay();
display.display();
} else {
label:
switch (curScreen) {
case 1: gpsScreen(); break;
case 2: mainScreen(); break;
case 3: timerScreen(); break;
case 4: page1(); break;
case 5: page2(); break;
case 6: page3(); break;
}
}
}
if (millis() - s > 5000) {
sleep = 1;
Serial.print("satellites - ");
Serial.println(sat);
Serial.print(hour);
Serial.print(":");
Serial.print(minute);
Serial.print(":");
Serial.println(second);
Serial.print(lat);
Serial.print("/");
Serial.println(lng);
Serial.println("---------------------------------");
//Serial.println(data);
}
}
// Running on core1
void setup1() {
Serial1.begin(9600);
Serial1.print("Hello from core1");
}
void loop1() {
//Serial1.print("1");
//Serial1.readBytes(data, 180);
sat = gps.satellites.value();
hour = gps.time.hour();
minute = gps.time.minute();
second = gps.time.second();
lat = gps.location.lat();
lng = gps.location.lng();
smartDelay(1000);
}
У меня не выходит так. Arduino IDE пишет, что все окей, но код не работает - экранчик молчит
Код работает так как вы его наиисали.
Не уверен что допустимо инициализировать Serial сразу с двух ядер одновременно.
Оставтье Serial.begin только в одном setup.
Не уверен что дисплей работает без инициализации. Где у вас display.begin ???
Для начала погоняйте примеры из библиотеки дисплея, а уж потом всё остальное.
Gps куда подключен физически ?
Вам бы диодиком помигать для начала, а вы уже в программисты себя записали …
ну так с чего вы взяли, что ваш код правильный?
Для проверки попробуйте загрузить что-нибудь простое, например код мигания светодиодом.
Плюс схема - её мы то же не видели…без шара…
Проблема решилась, из сетапа куда-то пропала инициализация дисплея. До этого плата определялась как ком-порт, я думал, что с ней что-то не так. Спасибо всем ответившим!
В форуме есть механизм Вопрос решен !