10浏览
查看: 10|回复: 0

[ESP8266/ESP32] 基于FireBeetle 2 实现 VGA视频输出

[复制链接]
之前有使用FireBeetle(ESP32)实现过 VGA 输出,这次基于 FireBeetle 2 ESP32-S3 的板卡来实现 VGA 的输出。
首先进行电路的设计,其中的HsyncVsync分别使用 IO1 IO2,颜色则通过 R-2R 来实现:
基于FireBeetle 2 实现 VGA视频输出图1
PCB 设计如下:
基于FireBeetle 2 实现 VGA视频输出图2
3D预览如下:
基于FireBeetle 2 实现 VGA视频输出图3

途中的USB母头是预留给外部供电的,比如,VGA-HDMI转接器通常需要外部供电,这种情况下可以从这个端口取电。
焊接之后插入FireBeetle 2 的板子(注意USB接口方向和 VGA接口方向相反):

基于FireBeetle 2 实现 VGA视频输出图4

接下来使用来自 https://github.com/spikepavel/ESP32-S3-VGA的库

运行如下代码
  1. #include "VGA.h"
  2. #include <FONT_9x16.h>
  3. VGA vga;
  4. int scale = 2;
  5. void setup()
  6. {
  7. //                   r,r,r,r,r,  g,g, g, g, g, g,   b, b, b, b, b,   h,v
  8. const PinConfig pins(4,5,6,7,8,  9,10,11,12,13,14,  15,16,17,18,21,  1,2);
  9.         Mode mode = Mode::MODE_640x480x60;
  10.        
  11.         if(!vga.init(pins, mode, 8, 3)) while(1) delay(1);
  12.        
  13.         vga.start();
  14.         for(int y = 0; y < 480; y++)
  15.                 for(int x = 0; x < 640; x++)
  16.                         vga.dotdit(x, y, x, y, 255-x);
  17.         vga.setFont(FONT_9x16);
  18.         vga.start();
  19.        
  20.         delay(5000);
  21. }
  22. void loop()
  23. {
  24. vga.clear(0);
  25. delay(1000);
  26. for(int count = 0; count < 100000; count++)
  27. vga.dot(rand()%640, rand()%480, rand()%255);
  28. delay(1000);
  29. vga.clear(0);
  30. delay(1000);
  31. for(int count = 0; count < 10000; count++)
  32. vga.line(rand()%640, rand()%480, rand()%640, rand()%480, rand()%255);
  33. vga.clear(0);
  34. delay(1000);
  35. vga.clear(0);
  36. delay(1000);
  37. for(int count = 0; count < 10000; count++)
  38. vga.tri(rand()%640, rand()%480, rand()%640, rand()%480, rand()%640, rand()%480, rand()%255);
  39. vga.clear(0);
  40. delay(1000);
  41. vga.clear(0);
  42. delay(1000);
  43. for(int count = 0; count < 1000; count++)
  44. vga.fillTri(rand()%640, rand()%480, rand()%640, rand()%480, rand()%640, rand()%480, rand()%255);
  45. vga.clear(0);
  46. delay(1000);
  47. vga.clear(0);
  48. delay(1000);
  49. for(int count = 0; count < 10000; count++)
  50. vga.rect(rand()%640, rand()%480, rand()%640, rand()%480, rand()%255);
  51. vga.clear(0);
  52. delay(1000);
  53. vga.clear(0);
  54. delay(1000);
  55. for(int count = 0; count < 1000; count++)
  56. vga.fillRect(rand()%640, rand()%480, rand()%640, rand()%480, rand()%255);
  57. vga.clear(0);
  58. delay(1000);
  59. vga.clear(0);
  60. delay(1000);
  61. for(int count = 0; count < 10000; count++)
  62. vga.circle(rand()%640, rand()%480, rand()%100, rand()%255);
  63. vga.clear(0);
  64. delay(1000);
  65. vga.clear(0);
  66. delay(1000);
  67. for(int count = 0; count < 5000; count++)
  68. vga.fillCircle(rand()%640, rand()%480, rand()%50, rand()%255);
  69. vga.clear(0);
  70. delay(1000);
  71. vga.clear(0);
  72. delay(1000);
  73. for(int count = 0; count < 10000; count++)
  74. vga.ellipse(rand()%640, rand()%480, rand()%100, rand()%100, rand()%255);
  75. vga.clear(0);
  76. delay(1000);
  77. vga.clear(0);
  78. delay(1000);
  79. for(int count = 0; count < 1000; count++)
  80. vga.fillEllipse(rand()%640, rand()%480, rand()%100, rand()%100, rand()%255);
  81. vga.clear(0);
  82. delay(1000);
  83. vga.clear(0);
  84. delay(1000);
  85. for(int count = 0; count < 100000; count++)
  86. vga.mouse(rand()%640, rand()%480);
  87. vga.clear(0);
  88. delay(1000);
  89. for(int count = 0; count < 1000; count++)
  90. {
  91.         static int c = 0;
  92.         static int d = 1;
  93.         c += d;
  94.         if (c == 0 || c == 255)
  95.                 d = -d;
  96.         char text[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  97.                                         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  98.                                         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  99.                                         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  100.                                         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  101.                                         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  102.                                         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  103.                                         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  104.                                         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  105.                                         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  106.                                         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  107.                                         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  108.                                         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  109.                                         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  110.                                         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  111.                                         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  112.                                         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  113.                                         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  114.                                         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  115.                                         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  116.                                         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  117.                                         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  118.                                         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  119.                                         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  120.                                         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  121.                                         0, 0, 0, 0, 0, 0
  122.                                   };
  123.        
  124.         for (int i = 0; i < 256; i++)
  125.                 text[i] = 33 + (i + (c >> 2));
  126.         vga.setCursor(8, 48);
  127.         vga.setTextColor(vga.rgb(c, 255 - c, 255), vga.rgb(0, c / 2, 127 - c / 2));
  128.         vga.print(text);
  129.         vga.setCursor(8, 148);
  130.         vga.print(text);
  131.         vga.setCursor(8, 248);
  132.         vga.print(text);
  133.         vga.setCursor(8, 348);
  134.         vga.print(text);
  135. }
  136. delay(4000);
  137. }
复制代码

实践测试发现,这个板卡在不同显示器上会有兼容性问题,可能和选择的分辨率有关系。
工作的测试视频




























您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail